Ich habe ein Bash-Skript test.sh
, das die folgenden Befehle enthält
#!/bin/bash
PASSWORD=""
USERNAME=""
REM_HOSTNAME='localhost'
FILES_TO_COPY="remote_exec.sh"
function scptmp {
exec sshpass -p $PASSWORD scp -o "ConnectTimeout 3" \
-o "StrictHostKeyChecking no" \
-o "UserKnownHostsFile /dev/null" \
"$@"
}
echo -e "\tCopying files to remote host..."
scptmp -r -q $FILES_TO_COPY $USERNAME@$REM_HOSTNAME:/tmp
echo -e "\tSet execution privs on remote file..."
sshpass -p "$PASSWORD" ssh -t -oStrictHostKeyChecking=no $USERNAME@$REM_HOSTNAME "echo $PASSWORD | sudo -S chmod +x /tmp/$FILES_TO_COPY"
echo -e "\Execute..."
sshpass -p "$PASSWORD" ssh -oStrictHostKeyChecking=no -t $USERNAME@$REM_HOSTNAME "echo $PASSWORD | sudo -S bash /tmp/$FILES_TO_COPY"
Und zwar remote_exec.sh
mit folgendem Inhalt:
#!/bin/bash
hostname=`hostname`
mkdir $hostname
Wenn ich das Skript ausführe mit
bash test.sh
Ich erhalte keine Fehlermeldung, aber es remote_exec.sh
scheint, als würde es auf dem Host nicht ausgeführt, da kein Verzeichnis erstellt wird.
Hat jemand eine Idee, was das Problem sein könnte?
Antwort1
Mit exec
ersetzen Sie die aktuelle Shell durch den Prozess, der aus der Ausführung des folgenden Befehls resultiert. Das bedeutet, dass beim Aufrufen Ihrer scptmp
Funktion die Shell, die gerade Ihr Skript ausführt, durch den sshpass
Prozess ersetzt wird. Wenn das sshpass
Dienstprogramm in der Funktion die Ausführung beendet hat, wird das Skript nicht mehr ausgeführt.
Antwort2
Einfache Anführungszeichen verhindern die Auswertung der darin enthaltenen Variablen. Versuchen Sie es mit doppelten Anführungszeichen:
sshpass -p $PASSWORD ssh -t user@host "echo $PASSWORD | sudo -S bash /tmp/remote_exec.sh"
Antwort3
In meinem Fall habe ich mich zum ersten Mal mit dem Remote verbunden, während der Benutzer das Skript ausführte. Versuchen Sie daher,
SSH <REMOTE_IP>
mit dem betroffenen Benutzer. Wenn eine Eingabeaufforderung zur „Authentizität des Hosts“ angezeigt wird, kann dies ein Problem sein.
The authenticity of host '<REMOTE-IP>' can't be established.
Are you sure you want to continue connecting (yes/no)? yes
Abhängig von der Umgebung und Ihren Richtlinien können Sie das Skript einfach bestätigen und erneut starten.
Antwort4
Versuche Folgendes:
sshpass -p $PASSWORD ssh -t user@host<<EOF
echo uname -a
cd /tmp/ || exit 1
echo $PASSWORD | sudo -S bash ./remote_exec.sh
exit $?
EOF