SSH: Shutdown mittels Skript
Hallo,
Ich möchte einen Server über SSH herunterfahren. Auf ihm ist SSH aktiviert, es gibt einen Account "SDAccount" als Mitglied der lokalen Administratoren. SSH auf dem Client ist aktiviert.
Manuell kann ich den Server herunterfahren über
wobei nach Zeile 1 und 2 jeweils das Passwort abgefragt wird. Ich bin mir im Klaren darüber, dass das aus Sicherheitsgründen genau so gemacht werden muss, inklusive der Tatsache, dass man sich bei den beiden Passworteingaben nicht verschreiben darf, da die Eingabe nicht angezeigt wird.
Allerdings muss ich das automatisieren können, da das Herunterfahren über ein Skript erfolgen soll, das via Aufgabenplanung aufgerufen wird. Ich dachte an ein PS-Skript, Batch wäre aber auch möglich.
Allerdings habe ich nach zahllosen Versuchen keine Möglichkeit gefunden, das zu bewerstelligen. Ich weiß, das PLink dazu (u. a.) geschaffen wurde, würde aber gerne unabhängig von weiteren Programmen sein: PowerShell gibt es auf allen Windows-Clients.
Hat jemand eine Lösung?
Danke für Zeit und Mühen.
Gruß,
ASMFreak
Ich möchte einen Server über SSH herunterfahren. Auf ihm ist SSH aktiviert, es gibt einen Account "SDAccount" als Mitglied der lokalen Administratoren. SSH auf dem Client ist aktiviert.
Manuell kann ich den Server herunterfahren über
ssh SDAccount@SSHServer
sudo -i
shutdown
wobei nach Zeile 1 und 2 jeweils das Passwort abgefragt wird. Ich bin mir im Klaren darüber, dass das aus Sicherheitsgründen genau so gemacht werden muss, inklusive der Tatsache, dass man sich bei den beiden Passworteingaben nicht verschreiben darf, da die Eingabe nicht angezeigt wird.
Allerdings muss ich das automatisieren können, da das Herunterfahren über ein Skript erfolgen soll, das via Aufgabenplanung aufgerufen wird. Ich dachte an ein PS-Skript, Batch wäre aber auch möglich.
Allerdings habe ich nach zahllosen Versuchen keine Möglichkeit gefunden, das zu bewerstelligen. Ich weiß, das PLink dazu (u. a.) geschaffen wurde, würde aber gerne unabhängig von weiteren Programmen sein: PowerShell gibt es auf allen Windows-Clients.
Hat jemand eine Lösung?
Danke für Zeit und Mühen.
Gruß,
ASMFreak
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 672078
Url: https://administrator.de/forum/ssh-shutdown-mittels-skript-672078.html
Ausgedruckt am: 21.03.2025 um 09:03 Uhr
15 Kommentare
Neuester Kommentar
Hi,
klar...
https://github.com/darkoperator/Posh-SSH
Ungetestet. Bin mir gerade nicht sicher, ob es die Action so ohne Enter abfeuert. Müsste es aber. Ansonsten kann m an auch den 2. Nehmen mit Return am Ende.
Hier erwartet er im Stream "Password:" nachdem das Kommando abgesetzt wurde.
Geht auch mit Zertifikat ohne Kennwort. Wobei manche meine, es muss dann mindestens leer sein, damit der Code nicht zusammenbricht.
So könnte es hinhauen.
klar...
https://github.com/darkoperator/Posh-SSH
if (!(Get-Module -Name posh-ssh)) {
Import-Module -Name posh-ssh
}
$HostName = "TollerServer"
$LinuxUser = "frank"
$LinuxPassword = "SuperGeheim"
$LinuxPasswordEnter = "SuperGeheim `r"
$command2Execute = "sudo shutdown -h now"
$CredentialLinux = New-Object System.Management.Automation.PSCredential ($LinuxUser, $LinuxPassword)
$linuxSSHsession = New-SSHSession -ComputerName $HostName -Credential $CredentialLinux -AcceptKey
$streamLinux = New-SSHShellStream -SessionId $linuxSSHsession.SessionId
Invoke-SSHStreamExpectAction -ShellStream $streamLinux -Command "$command2Execute" -ExpectRegex 'Password:' -Action $LinuxPassword -Verbose
$linuxSSHsession | Remove-SSHSession
Ungetestet. Bin mir gerade nicht sicher, ob es die Action so ohne Enter abfeuert. Müsste es aber. Ansonsten kann m an auch den 2. Nehmen mit Return am Ende.
Hier erwartet er im Stream "Password:" nachdem das Kommando abgesetzt wurde.
Geht auch mit Zertifikat ohne Kennwort. Wobei manche meine, es muss dann mindestens leer sein, damit der Code nicht zusammenbricht.
So könnte es hinhauen.
Moin,
Anschließend kannst du das System ganz einfach per SSH herunterfahren...
Gruß Thomas
Zitat von @ASMFreak:
Ich bin mir im Klaren darüber, dass das aus Sicherheitsgründen genau so gemacht werden muss, inklusive der Tatsache, dass man sich bei den beiden Passworteingaben nicht verschreiben darf, da die Eingabe nicht angezeigt wird.
nö, wieso? Erlaube einfach dem entsprechenden User das System ohne Passworteingabe herunterzufahren. Einmalig...Ich bin mir im Klaren darüber, dass das aus Sicherheitsgründen genau so gemacht werden muss, inklusive der Tatsache, dass man sich bei den beiden Passworteingaben nicht verschreiben darf, da die Eingabe nicht angezeigt wird.
cat << -- |sudo tee /etc/sudoers.d/010_allow_shutdown
SDAccount ALL=(ALL) NOPASSWD: /usr/sbin/poweroff
--
Anschließend kannst du das System ganz einfach per SSH herunterfahren...
ssh SDAccount@SSHServer '/usr/bin/sudo /usr/sbin/poweroff'
Gruß Thomas
Moin,
unnötig. Der OpenSSH-Client ist längst standardmäßig in Windows vorhanden.
Gruß Thomas
unnötig. Der OpenSSH-Client ist längst standardmäßig in Windows vorhanden.
Gruß Thomas
Zitat von @TK1987:
Moin,
unnötig. Der OpenSSH-Client ist längst standardmäßig in Windows vorhanden.
Gruß Thomas
Moin,
unnötig. Der OpenSSH-Client ist längst standardmäßig in Windows vorhanden.
Gruß Thomas
Aber doch nicht Posh-SSH? Ist ja ein Wrapper. Geht ja um die anderen Funktionen.
Oder wie baut man sowas wie expect unter Linux mit Windows PS nach? Await hab ich schon gesehen. Aber Stream Inspektion und Autofill.
Wie machst du das unter Windows?
Also das bringt mich auch gerade um!
3x problemlos shutdown, nun will er nicht mehr.
Setze den normal gegen gegen eine Watchguard ein und einen Ubuntu Server Da kann ich aus dem Stream sogar Daten einfach abgreifen.
Bei dir geht es nicht, da Posh-SSH fehlt!
Normal soll es teils als "Einzeiler" so laufen, dass ein Kommando im Stream abgesetzt wird und gewartet wird, bis ein Ausdruck kommt.
Eine Fehlerquelle: Deutsch / Englisch - Passwort vs. Password...
Bin auch gerade ratlos. Eigentlich ist es genau dafür gedacht. Siehe auch dieses Bsp.
Hier wird aber durch read-host wieder Eingabe nötig.
Normal kann man Passwort als Secure String hinterlegen. Zertifikate abfragen, Invoke-xyz irgendwas....
Ich kaue auch gerade drauf rum. Oben an dem Ausschnitt sieht man aber, dass der gesamte Remote-Stream abgegriffen wird und auch der Eingabeprompt erscheint.
3x problemlos shutdown, nun will er nicht mehr.
Setze den normal gegen gegen eine Watchguard ein und einen Ubuntu Server Da kann ich aus dem Stream sogar Daten einfach abgreifen.
8 zusätzliche Sicherheitsupdates können mit ESM Apps angewendet werden.
Erfahren Sie mehr über die Aktivierung des ESM Apps-Dienstes at https://ubuntu.com/esm
Last login: Thu Mar 20 20:24:19 2025 from 172.18.0.101
sudo shutdown -r now
crusher@crusher-virtual-machine:~$ sudo shutdown -r now
[sudo] Passwort für crusher:
Bei dir geht es nicht, da Posh-SSH fehlt!
Install-Module -Name Posh-SSH
Normal soll es teils als "Einzeiler" so laufen, dass ein Kommando im Stream abgesetzt wird und gewartet wird, bis ein Ausdruck kommt.
Eine Fehlerquelle: Deutsch / Englisch - Passwort vs. Password...
Bin auch gerade ratlos. Eigentlich ist es genau dafür gedacht. Siehe auch dieses Bsp.
Invoke-SSHStreamExpectSecureAction -ShellStream $stream -Command 'su -' -ExpectString 'Passord:' -SecureAction (read-host -AsSecureString) -Verbose
Hier wird aber durch read-host wieder Eingabe nötig.
Normal kann man Passwort als Secure String hinterlegen. Zertifikate abfragen, Invoke-xyz irgendwas....
Ich kaue auch gerade drauf rum. Oben an dem Ausschnitt sieht man aber, dass der gesamte Remote-Stream abgegriffen wird und auch der Eingabeprompt erscheint.
Das musst du natürlich auch auf dem Server ausführen.
So ich habs...
Unten steht vlt. mit Dispose etc. nicht benötigtes. Aber damit hat es nun 3 mal hingahauen
Regex gegen das Linux Prompt!
Das hab ich gerade 3 Mal hintereinander gemacht.
Wie gesagt, du musst noch das Modul installieren.
AUSFÜHRLICH: Executing command sudo shutdown -r now.
AUSFÜHRLICH: Waiting for match.
AUSFÜHRLICH: Matching by RegEx.
AUSFÜHRLICH: Executing action.
AUSFÜHRLICH: Action has been executed.
True
Broadcast message from root@crusher-virtual-machine on pts/1 (Thu 2025-03-20 21:11:29 CET):
The system will reboot now!
Unten steht vlt. mit Dispose etc. nicht benötigtes. Aber damit hat es nun 3 mal hingahauen
Regex gegen das Linux Prompt!
Das hab ich gerade 3 Mal hintereinander gemacht.
Wie gesagt, du musst noch das Modul installieren.
$HostName = "172.18.0.179"
$LinuxUser = "crusher"
$command2Execute = "sudo shutdown -r now"
$LinuxPassword = "xxxxxx"
$Passwordx = ConvertTo-SecureString $LinuxPassword -AsPlainText -Force
$CredentialLinux = New-Object System.Management.Automation.PSCredential ($LinuxUser, $Passwordx)
$linuxSSHsession = New-SSHSession -ComputerName $HostName -Credential $CredentialLinux -AcceptKey
$streamLinux = New-SSHShellStream -SessionId $linuxSSHsession.SessionId
$sudoPassPropmp = [regex]':\s$'
Invoke-SSHStreamExpectSecureAction -ShellStream $streamLinux -Command $command2Execute -ExpectRegex $sudoPassPropmp -SecureAction $Passwordx -Verbose
sleep -Seconds 1
$streamLinux.Read()
sleep -Seconds 1
$streamLinux.Close()
$streamLinux.Dispose()
$linuxSSHsession | Remove-SSHSession
@ASMFreak
So funktioniert es. Wie du denken kannst wegen dem Regex auch in allen Sprachen.
Ich überlege gerade, ob das Teil irgendwo das Kennwort sonst hinschreibt.
So nun 6x hintereinander getestet. Das läuft soweit.
Normal schließt man Sitzungen am Ende. Da wird aber eh shutdown machen, kann man hier wohl auch drauf verzichten. Ich glaub die Position ohne Regex stimmt nicht. Pattern-Match war ja vorhanden, nur das Kammando verpufft.
Wie du oben sehen kannst: Kein ENTER mit `r \r oder so.
Commando führt das Modul schon am Ende selber aus.
So funktioniert es. Wie du denken kannst wegen dem Regex auch in allen Sprachen.
$sudoPassPropmp = [regex]':\s$'
Ich überlege gerade, ob das Teil irgendwo das Kennwort sonst hinschreibt.
So nun 6x hintereinander getestet. Das läuft soweit.
Normal schließt man Sitzungen am Ende. Da wird aber eh shutdown machen, kann man hier wohl auch drauf verzichten. Ich glaub die Position ohne Regex stimmt nicht. Pattern-Match war ja vorhanden, nur das Kammando verpufft.
Wie du oben sehen kannst: Kein ENTER mit `r \r oder so.
Commando führt das Modul schon am Ende selber aus.
Noch ein Nachtrag:
Ich weiß nicht warum, ohne 1 Gedenksekunde und erneuten Stream.Read() mag er nicht. Mit den 2 Zeilen fährt der PC sofort runter.
Wie gesagt, hab damit auch noch nicht viel gemacht. Watchguard z.B. geht auch ganz gut. Entweder Loops oder Waits ggf. noch reinballern.
Mit diesen simplen Zeilen oben geht es auf anhieb. Normal wartet man ja teils bei Prozessen. Ein Invoke, der einen Shutdown abfeuert, sollte sich aber ja sofort bemerkbar machen.
Ich weiß es wirklich nicht. Aber mit den 2 Zeilen mehr geht es sofort, wiederkehrend, sicher..............
sleep -Seconds 1
$streamLinux.Read()
Ich weiß nicht warum, ohne 1 Gedenksekunde und erneuten Stream.Read() mag er nicht. Mit den 2 Zeilen fährt der PC sofort runter.
Wie gesagt, hab damit auch noch nicht viel gemacht. Watchguard z.B. geht auch ganz gut. Entweder Loops oder Waits ggf. noch reinballern.
Mit diesen simplen Zeilen oben geht es auf anhieb. Normal wartet man ja teils bei Prozessen. Ein Invoke, der einen Shutdown abfeuert, sollte sich aber ja sofort bemerkbar machen.
Ich weiß es wirklich nicht. Aber mit den 2 Zeilen mehr geht es sofort, wiederkehrend, sicher..............
Zitat von @ASMFreak:
wobei nach Zeile 1 und 2 jeweils das Passwort abgefragt wird. Ich bin mir im Klaren darüber, dass das aus Sicherheitsgründen genau so gemacht werden muss, inklusive der Tatsache, dass man sich bei den beiden Passworteingaben nicht verschreiben darf, da die Eingabe nicht angezeigt wird.
Warum statt Kennwort nicht einfach ein Schlüsselpaar verwenden?
Hilft nur beim Erstellen der Session. Nachher muss man teils prompt auswerten. Ohne root login hat man immer eine Hürde. Und root Login rächt sich ggf irgendwann.