Unter Ubuntu 16.04 möchte ich mithilfe von VS Code ein lokales Skript mit Berechtigungen auf einem Remote-Server ausführen sudo
.
Hier ist local.sh
:
#!/usr/bin/env bash
echo $(ifconfig | grep -Eo "inet addr:([0-9]\.?)*")
echo $(whoami)
echo "$1"
Hier ist eine Version des test.sh
Skripts, das ich zur Remote-Ausführung verwende local.sh
:
#!/usr/bin/env bash
remote="example.com"
user="username"
password="remote_password"
ssh "$user@$remote" "bash -s" < ./local.sh "'argument 1'"
Das funktioniert einwandfrei. Hier ist die Ausgabe, wie erwartet:
$ ./test.sh
inet addr:123.45.67.89 inet addr:127.0.0.1
username
argument 1
Die erste IP-Adresse ist tatsächlich die IP-Adresse des Servers.
local.sh
Ich möchte jedoch mit auf dem Remote-Server laufen sudo
. Wenn ich die letzte Zeile durch die folgende Zeile ersetze, wird der Zugriff blockiert:
ssh -tt "$user@$remote" "echo $password | sudo bash -s" < ./local.sh "'argument 1'"
Ausgabe:
$ ./test.sh
[sudo] password for username:
Sorry, try again.
[sudo] password for username:
Wenn ich nach der zweiten Eingabeaufforderung ein Kennwort eingebe, werden die Zeichen im Terminal angezeigt. Wenn ich die Eingabetaste drücke, passiert nichts. Daher verwende ich ^C zum Abbrechen.
Wenn ich nur -t
als Flag verwende ssh
, erhalte ich die Ausgabe:
Pseudo-terminal will not be allocated because stdin is not a terminal.
sudo: no tty present and no askpass program specified
Wenn ich überhaupt keine Flags verwende, erhalte ich:
sudo: no tty present and no askpass program specified
Andere Lösungsvorschläge, die ich gesehen habe, waren nicht erfolgreicher. Ich bin für alle Ideen dankbar, was ich tun sollte.
Antwort1
Um zu erreichen, was Sie tun möchten, versuchen Sie expect
Und um es sicher zu halten, versuchen Sie, Ihre Dateien zu verschlüsseln
http://manpages.ubuntu.com/manpages/bionic/man1/expect.1.html
Antwort2
Installieren expect
und verwenden Sie das folgende Skript (nicht getestet, es kann Fehler enthalten):
#!/usr/bin/expect
set remote "example.com"
set user "username"
set password "remote_password"
spawn ssh -l $user $remote
expect "$ "
send "sudo bash -s < ./local.sh 'argument 1'\r"
expect "password for $user:"
send "$password\r"
expect "$ "
send "exit\r"
expect
simuliert eine interaktive Sitzung. Der spawn
Befehl wird ausgeführt ssh -l $user $remote
und die folgenden Befehle interagieren mit ihm. Der expect
Befehl wartet, bis der angegebene Text in der Ausgabe erscheint, und send
sendet den Text dann an den Remote-Host. Weitere Informationen finden Sie unter dem in der anderen Antwort angegebenen Link.