Ich automatisiere einen Bereitstellungsprozess und möchte nur eine .sh-Datei auf meinem Computer aufrufen, meinen Build ausführen und die .zip-Datei auf den Server hochladen und dann einige Dinge auf dem Server erledigen können. Eines der Dinge, die ich tun muss, erfordert, dass ich root bin. Also, was ich tun möchte, ist Folgendes:
ssh user@172.1.1.101 <<END_SCRIPT
su -
#password... somehow...
#stop jboss
service server_instance stop
#a bunch of stuff here
#all done!
exit
END_SCRIPT
Ist das überhaupt möglich?
Antworten:
Haben Sie stattdessen ein Sudo ohne Passwort in Betracht gezogen?
quelle
Verwenden Sie statt su sudo mit dem in sudoers festgelegten NOPASSWD für die entsprechenden Befehle. Sie sollten den zulässigen Befehlssatz so gering wie möglich halten. Das Ausführen eines Skripts für die root-Befehle ist möglicherweise die sauberste und mit Abstand einfachste Methode, um die Sicherheit zu gewährleisten, wenn Sie mit der Syntax von sudoer-Dateien nicht vertraut sind. Bei Befehlen / Skripten, für die die vollständige Umgebung geladen werden muss,
sudo su - -c command
funktioniert dies, obwohl dies möglicherweise zu viel bedeutet.quelle
Was Sie beschreiben, ist möglicherweise mit expect möglich .
quelle
Sie können einen Befehl als Argument an SSH übergeben, um diesen Befehl nur auf dem Server auszuführen, und dann Folgendes beenden:
Dies funktioniert auch für eine Liste mit mehreren Befehlen:
Oder alternativ:
Wie bereits von anderen Benutzern erwähnt, wird beim Ausführen
su
auf dem Server eine neue Shell gestartet, anstatt nachfolgende Befehle im Skript als root auszuführen. Sie müssen entwedersudo
oder verwendensu -c
und die TTY-Zuweisung zu SSH mit dem-t
Switch erzwingen (erforderlich, wenn Sie das root-Passwort eingeben müssen):Alles in allem wäre eine Möglichkeit, das zu erreichen, was Sie tun möchten:
Da Sie sich in der
sudo
Regel einige Minuten lang an die Berechtigungsstufe erinnern, bevor Sie erneut nach dem Root-Kennwort gefragt werdensudo
, ist es wahrscheinlich die einfachste Methode, Befehle als Root auf dem Server auszuführen, wenn Sie alle Befehle voranstellen , die Sie als Root ausführen müssen. Hinzufügen einerNOPASSWD
Regel für Ihren Benutzer in/etc/sudoers
würde den Prozess noch reibungsloser gestalten.Ich hoffe das hilft :-)
quelle
NOPASSWD
Regel benötigen , lesen Sie die Beispiele unten inman sudoers
. Denken Sie auch daran,visudo
beim Bearbeiten Ihrersudoers
Datei zu verwenden, um Beschädigungen zu vermeiden!su -c
anstelle von verwendensudo
, sollten Sie SSH mit dem-t
Flag ausführen. Wenn der Befehl ausgeführt wird, werden Sie zur Eingabe des Root-Kennworts auf dem Server aufgefordert. Ein Passwort Providing direktsu
als Argument Befehlszeile wird weder unterstützt (soweit ich weiß), noch empfohlen - da ein einfacheps -ef | grep su
alle Argumente offenbart weitergegebensu
von der Kommandozeile jeden Passwort, einschließlich zur Verfügung gestellt ...su -c
über SSH aufrufen :ssh -t user@host 'su -lc "
<br />echo this is a test
<br />echo this is another test
<br />"
<br />'
<br />
Obige durch Zeilenumbrüche in Ihrem Skript. Off-Topic: Können Sie ServerFault-Kommentaren neue Zeilen hinzufügen? Das wäre sehr nützlich, wenn Sie Code-Schnipsel veröffentlichen ...Nein. Auch wenn Sie das Passwort dafür haben
su
, müssen Sie sich mit der Tatsache befassen, dasssu
eine neue Shell geöffnet wird, was bedeutet, dass Ihre weiteren Befehle nicht an diese Shell weitergeleitet werden. Sie müssen ein Skript für die Root-Operationen zusammen mit einer ausführbaren Hilfsprogrammdatei schreiben, die es mit den entsprechenden Berechtigungen aufrufen kann.quelle
Schreiben Sie ein Expect-Skript. Ich weiß, dass Sie bereits eine Antwort darauf gefunden haben, aber dies kann hilfreich sein, wenn Sie sich bei einer Reihe von Servern anmelden müssen, für die eine interaktive Kennworteingabe erforderlich ist.
Es ist eine Sprache, die auf TCL basiert, daher ist es im Vergleich zu einfachen alten Shell-Skripten vielleicht etwas seltsam. Es übernimmt jedoch die Automatisierung der Texteingabe und "erwartet", wie Sie vermutet haben, bestimmte Ausgabefelder, bevor eine Art automatisierte Kennworteingabe oder eine Eskalation von Berechtigungen vorgenommen wird.
Hier ist ein guter Link als Leitfaden: http://bash.cyberciti.biz/security/expect-ssh-login-script/
Nur für den Fall, dass die Website ausfällt:
quelle
Ich weiß, dass dies etwas spät ist, aber ich würde persönlich Net :: SSH :: Expect verwenden, das bei CPAN erhältlich ist.
http://search.cpan.org/~bnegrao/Net-SSH-Expect-1.09/lib/Net/SSH/Expect.pod
quelle
Sie können 'ssh example.com su -lc "$ cmd"' verwenden.
Wenn der Befehl Optionen enthält, müssen Sie ihn in Anführungszeichen setzen, andernfalls frisst "su" sie möglicherweise ("su: ungültige Option - 'A').
quelle