Die SSH-Remote-Dateiausführung funktioniert nicht

Die SSH-Remote-Dateiausführung funktioniert nicht

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.shmit 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.shscheint, 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 execersetzen Sie die aktuelle Shell durch den Prozess, der aus der Ausführung des folgenden Befehls resultiert. Das bedeutet, dass beim Aufrufen Ihrer scptmpFunktion die Shell, die gerade Ihr Skript ausführt, durch den sshpassProzess ersetzt wird. Wenn das sshpassDienstprogramm 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

verwandte Informationen