Ich denke, was Sie fragen, ist nicht einfach machbar, vielleicht sogar unmöglich mit einfachen Bash-Skripten.
Daher beantwortet das Folgende Ihre Frage nicht wirklich, bietet jedoch einen anderen Ansatz für Ihr Problem.
Anstatt zu verwenden sshpass
, können Sie den scp
Befehl plain mit einer publickey-Authentifizierung ohne Kennwort verwenden. Siehe [1], wenn Sie nicht wissen, was es ist.
Wenn Sie beabsichtigen, scp in Skripten für die lokale Verwendung zu verwenden , ist IMO der richtige Weg:
- Generieren Sie einen öffentlichen Schlüssel ohne Passwort
- Verwenden Sie
ssh-copy-id
diese Option, um Ihren öffentlichen Schlüssel zum Server hinzuzufügen
Das reicht bereits aus, um Ihren Befehl ohne Aufforderung ausführen zu können:
scp -r [email protected]:/cmshome/me/file /home/me/Desktop
Für Skripte, die Sie verteilen möchten, ist sshpass mit einem eindeutigen Kennwort sicherlich keine gute Idee. Verwenden Sie mindestens das Flag "-e" des sshpass und lassen Sie den Benutzer das Kennwort als Umgebungsvariable für eine bessere Sicherheit angeben.
In diesem Fall ist der Publickey-Ansatz etwas weniger bequem, aber dennoch möglich. Wenn Sie es sich nicht leisten können, den Benutzer des Skripts zum Erstellen eines öffentlichen Schlüssels aufzufordern, können Sie einen öffentlichen Schlüssel im laufenden Betrieb erstellen, auf den Server kopieren und scp
ohne Aufforderung ausführen :
#!/bin/bash
KEY="$HOME/.ssh/id_rsa_example"
if [ ! -e "$KEY" ]; then
ssh-keygen -t rsa -N "" -f "$KEY"
sshpass -e ssh-copy-id -i "${KEY}.pub" [email protected]
fi
scp -r [email protected]:/cmshome/me/file /home/me/Desktop
Schließlich gibt es noch die Möglichkeit, rsync
stattdessen den Fortschrittsbalken zu erstellen:
$ rsync -P --rsh="sshpass -p $PASSWORD ssh -l me8" host.ca:/cmshome/me/file /home/me/Desktop
[1] https://help.ubuntu.com/community/SSH/OpenSSH/Keys