Führen Sie ein lokales Skript auf einem Remote-Server mit Sudo-Berechtigungen aus

Führen Sie ein lokales Skript auf einem Remote-Server mit Sudo-Berechtigungen aus

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.shSkripts, 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.shIch 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 -tals 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 expectund 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"

expectsimuliert eine interaktive Sitzung. Der spawnBefehl wird ausgeführt ssh -l $user $remoteund die folgenden Befehle interagieren mit ihm. Der expectBefehl wartet, bis der angegebene Text in der Ausgabe erscheint, und sendsendet den Text dann an den Remote-Host. Weitere Informationen finden Sie unter dem in der anderen Antwort angegebenen Link.

verwandte Informationen