Wie benutzt man ssh und sudo zusammen in bash?

10

Ich konnte keine Frage finden, die dieses spezielle Szenario beschreibt.

Ich versuche, ein sehr einfaches Bash-Skript auszuführen, um die Protokollierung von mehreren Computern abzurufen. Ich führe das Skript lokal aus, muss aber über ssh auf einen externen Computer zugreifen und sudo einmal auf diesem Computer in einen privilegierten Benutzer einbinden ...

ssh myuser@machine.net
sudo su  - privledged_user
cat logs > file.txt

Wenn Sie dies mit sh-x ausführen, bleibt Bash in der 'ssh'-Zeile stecken. Also habe ich versucht, es dahingehend zu überarbeiten:

ssh myuser@machine.net sudo su - privledged_user cat logs > file.txt

Dies scheint auch auf unbestimmte Zeit zu blockieren. Gibt es eine bessere Lösung für dieses Problem? Ich sehe keinen Weg, um sudo su zu verwenden, soweit ich das beurteilen kann ...

Vielen Dank für jede Hilfe!

Matt124234
quelle
Warum die enge Abstimmung? Diese Frage ist zum Thema: Verwalten der Hardware oder Software von Servern, Workstations, Speicher oder Netzwerken, Tools zum Verwalten, Überwachen oder Automatisieren dieser
jlliagre

Antworten:

5

Die Art und Weise, wie ich dies in meiner aktuellen Umgebung erreiche, besteht darin, ssh mit dem -tFlag auszuführen, das die tty-Zuweisung erzwingt, und dann sudo -u root darin wie folgt auszuführen:

ssh -t hostname << EOF
  command1
  sudo -u root command2
  sudo -u otheruser "command3 | command4"
  sudo -u root /bin/bash -c "command5; command6; command7"
  command8 && ( sudo -u otheruser /bin/bash -c "cmd1 ${1}; cmd2 {$2}" ) || echo cmd2 did not work

EOF

Ich habe mein Konto in sudoers auf der Remote-Seite, so dass kein Passwort erforderlich ist.

Dieses Beispiel zeigt Ihnen verschiedene Möglichkeiten, dies innerhalb einer einzelnen SSH-Sitzung zu tun, einschließlich der Ausführung mehrerer Befehle mit Bash oder innerhalb einer Subshell. Beachten Sie auch, dass Sie, wenn Sie den obigen Code in ein ausführbares Skript einfügen, Befehlszeilenargumente ($ 1 und $ 2) an ssh übergeben können. Diese werden erweitert und dann auf der Remote-Seite referenziert.

Michael Martinez
quelle
Leider, weil ich den Remote-Server nicht verwalte, glaube ich , dass ich hier nicht mehr mit sudo su arbeiten kann. Würde das in diesem Format noch funktionieren?
Matt124234
Ja, es wird auch funktionieren. Sie können das Passwort eingeben, wenn Sie dazu aufgefordert werden.
Michael Martinez
Ich habe versucht: ssh -t [email protected] << EOF sudo su - adcentrl egrep 'FEHLER \ | WARN' / home / adcentrl / cronjobs / logs / * / * EOF Aber ich erhielt: "Pseudo -terminal wird nicht zugewiesen, da stdin kein Terminal ist. "
Matt124234
vollkommen in Ordnung. Ignorieren Sie diese Warnung und fahren Sie fort. Wenn Sie möchten, können Sie "RequireTty" in / etc / sudoers auf der Remote-Seite deaktivieren
Michael Martinez
5

Wenn Sie nicht möchten oder nicht verhindern können, dass sudo Sie nach dem Passwort fragt, besteht ein einfacher Trick darin, es lokal zu lesen und in einer lokalen Variablen zu speichern:

read -p 'Password: ' -s password

ssh -t user@1.2.3.4 <<EOF
  echo "$password" | sudo -S whoami
EOF
xpmatteo
quelle
1

Wenn sudo so konfiguriert ist, dass kennwortlose Befehle zulässig sind, sollte dies das tun, was Sie wollen:

ssh myuser@machine.net "sudo su - privileged_user -c 'cat logs'" > file.txt

oder

ssh myuser@machine.net "sudo su - privileged_user -c 'cat logs > file.txt'"

Dies hängt davon ab, ob die file.txtDatei lokal oder remote erstellt werden soll.

Andernfalls können Sie das Kennwort des Remotebenutzers folgendermaßen übergeben sudo:

echo mrhyner_password | \
  ssh mrhyner@test-server.net \
  "sudo -S su - adcentrl -c 'egrep ERROR\|WARN /home/adcentrl/cronjobs/logs/*/*'"
jlliagre
quelle
Sehr interessant. Die Verwendung von ssh ohne -t sagt mir jedoch "kein tty vorhanden". Durch Hinzufügen von -t wird dieser Fehler behoben, aber 'sudo su' scheint nicht berücksichtigt zu werden, da ich zur Eingabe eines Kennworts aufgefordert werde. Folgendes mache ich speziell: ssh -t [email protected] "sudo su - adcentrl -c egrep" FEHLER \ | WARN "/ home / adcentrl / cronjobs / logs / * / *" Dies gibt mir: bash : WARN: Befehl nicht gefunden [sudo] Passwort für mrhyner:
Matt124234
Entschuldigung, ich weiß anscheinend nicht, wie ich meine Kommentare in dieser Sache
formatieren soll
Ich ging davon aus, dass sudo für Ihr Remote-Konto so konfiguriert wurde, dass es kein Passwort enthält.
Jlliagre
und Sie vermissen zusätzliche einfache Anführungszeichen.
Jlliagre
Dies hat mich zu dem Schluss gebracht, dass bash den Befehl ssh aus irgendeinem Grund nicht einhält. Es
verhält sich