GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Passwort mit Sonderzeichen zur Verwendung mit Expect-Skript konvertieren?

Ich habe ein erwartetes Skript, das eine Verbindung zu einer SFTP-Site herstellt und einige Dateien hochlädt. ID und Passwort sind in lokalen Textdateien enthalten. Das Expect-Skript liest diese Dateien als Variable ein und übergibt sie dann an den SFTP-Server.

Das Problem, das ich erlebe, ist, dass uns Passwörter mit einer Komplexität bereitgestellt werden, die Sonderzeichen ($\,!) usw. enthält. Wenn das Passwort beispielsweise pass$word ist, wird das $ als Sonderzeichen und nicht als Literal übergeben. Da dies durch eine Variable geleitet wird (mehrere Sites und IDs)

Ich kann „$pw“ nicht verwenden, da es $pw buchstäblich an den Server weiterleitet und die Verwendung von „$pw“ Sonderzeichen sendet. Ich brauche es, um das Passwort genau so weiterzugeben.

Ich habe sie bisher von Hand maskiert (z. B. pass\$word), aber das ist mühsam und ich würde es gerne skripto-matisch machen.

Das Skript sieht so aus (Namen und Orte geändert, um Unschuldige zu schützen)

#!/bin/bash

home=/data/ftp/vf/drop/
un=`cat /home/vf/workflow/.udf/.u/.u$1`
pw=`cat /home/vf/workflow/.udf/.p/.p$1`
sl=`cd /home/vf/workflow/scheduler; grep $1 upload*|cut -d \: -f1`

/usr/bin/expect -c "
spawn /usr/bin/sftp -o KexDHMin=1024 [email protected]$sl.mysteriouslocation.com
set timeout -1
expect *Authentication
expect Password*
send \"$pw\r\"
expect sftp*
send \"mput /$home/$1/transfer/*\r\"
expect sftp*
send \"ls \r\"
expect sftp*
send \"bye\r\"
expect eof
exit

Wie kann ich entweder das Passwort an das Expect-Skript weitergeben, damit es die wörtlichen Zeichen sendet und ihnen keine besondere Bedeutung gibt?
Ich glaube nicht, dass ich einen „Fix“ für die Passwortdatei selbst schreiben kann, was bedeutet, dass ich hineingehe und jedes Mal, wenn es ein Sonderzeichen sieht, maskieren Sie es über sed oder auf andere Weise, da das Escape-Zeichen selbst etwas Besonderes ist und in einer Schleife enden könnte.

Ihre Hilfe wird sehr geschätzt!

Akzeptierte Antwort:

Ein kleines Perl-Snippet kann verwendet werden, um alle ASCII-Zeichen zu maskieren (Backslash), die nicht mit /[A-Za-z_0-9]/ übereinstimmen indem Sie die quotemeta-Funktion verwenden. Die Perl-Befehlszeile lässt sich leicht in Ihr Shell-Skript integrieren:

#/bin/sh
pstr='$x%y!zpass' # plain, un-escaped string
estr=$(perl -e 'print quotemeta shift(@ARGV)' "${pstr}")
echo ${estr}      # show escaped string

produziert:

\$x\%y\!zpass

Linux
  1. So verwenden Sie ein verschlüsseltes Passwort in einem Linux-Bash-Shell-Skript

  2. Virtualisierung auf dem PC, erklärt für Einsteiger mit praktischen Anwendungsfällen

  3. SSHPass:SSH-Zugang zu einem Server mit einem Skript ohne Passwort (nicht interaktiv)

  4. Verwenden Sie die Erweiterung .sh oder .bash für Bash-Skripte?

  5. Skript zum Ändern des Passworts auf Linux-Servern über ssh

So verwenden Sie MySQL mit der Ruby On Rails-Anwendung

Bash-Skript für Schleife mit Beispielen erklärt

Verwenden Sie Expect in einem Bash-Skript, um einem SSH-Befehl ein Kennwort bereitzustellen

Wie verwende ich Expect mit optionalen Eingabeaufforderungen?

So verwenden Sie Lookahead, um Sonderzeichen in einem regulären Ausdruck auszuschließen

Grammatikprüfwerkzeug zur Verwendung mit LaTeX?