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
1
2
3
2
3
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: 24.04.2025 um 13:04 Uhr
31 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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.
1
2
3
2
3
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...
1
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.
1
2
3
4
5
6
7
2
3
4
5
6
7
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!
1
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.
1
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.
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$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.
1
$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..............
1
2
2
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.
Zitat von @ASMFreak:
er verlangt also weiterhin das Passwort.
Jetzt redest du aber von 2 verschiedenen Dingen:1
2
3
2
3
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'SSHServer' (ED25519) to the list of known hosts.
UserName@SSHServer's password:
- Das Anmeldepasswort am SSH-Server - das wirst du los, indem du dich mit einem Schlüsselpaar anstelle eines Passworts anmeldest
- Das sudo-Passwort des Benutzers - das wirst du los, indem du dem Benutzer per Sudoers-Eintrag erlaubst, den Befehl ohne Passwort ausführen, wie oben beschrieben.
Also.... Du musst für meinen Kram dieses Posh-SSH Dingens installieren!
PowerShell als Admin starten und das Kommando ausführen.
Ggf. PS dananch mal neustarten. Anonsten sollte es später installiert sein, aber nicht in der Session aktiv, so kannst du es mit einen Import-Module in die Sitzung bringen. Die 2 Zeilen ganz nach oben.
Nun sollte es aber gehen.
Ich hab es gestern gegen meinen Ubuntu Laptop probiert. So wie der Code dasteht funktioniert er!
PowerShell als Admin starten und das Kommando ausführen.
1
Install-Module -Name Posh-SSH
Ggf. PS dananch mal neustarten. Anonsten sollte es später installiert sein, aber nicht in der Session aktiv, so kannst du es mit einen Import-Module in die Sitzung bringen. Die 2 Zeilen ganz nach oben.
1
2
3
2
3
if (!(Get-Module -Name posh-ssh)) {
Import-Module -Name posh-ssh
}
Nun sollte es aber gehen.
Ich hab es gestern gegen meinen Ubuntu Laptop probiert. So wie der Code dasteht funktioniert er!
TK1987
Zitat von @ASMFreak:
Danke, TK1987, das wird mit zu kompliziert mit Schlüsselpaar und Passwort - ich denke, dann ist der Weg über Plink einfacher, auch wenn ich gerne darauf verzichtet hätte.
Danke, TK1987, das wird mit zu kompliziert mit Schlüsselpaar und Passwort - ich denke, dann ist der Weg über Plink einfacher, auch wenn ich gerne darauf verzichtet hätte.
Ist es nicht. Putty generiert Schlüssel. Eine Gefahr ist, dass SSH den neuen OpsenSSL Key haben will. Kann man in Puttygen Exportieren.
Den Public key zeigt dir das Tool sogar an! Kann man 1:1 ni die authorized Datei kopieren.
~/.ssh/authorized_keys und gut ist.
Die gibt es pro Benutzer Leider auch dann bei root und User Karl. Wenn du dich also als Karl anmeldest, so nimmt es die hinterlegten Schlüssel im /home/karl/.ssh/authorized_keys
Das war es schon fast. Alles andere sind nur 2-3 Einstellungen in ssh config.
Der Wrapper Posh-SSH - der wie @TK1987 schon sagte auf die bereits vorhanden SSH Module "scharf"geht, arbeitet auch mit Schlüsseln.
-KeyFile
Der Vorteil von meiner Methode ist, dass man sudo mit Passwort weiter verwenden kann. Nachteil ist nur, dass das Passwort im Script steht und übergeben werden muss.
Kennwort manuell immer eingeben, Autofill oder Programme ohne sudo ausführen sind deine Optionen!
Daran ist überhaupt nichts kompliziert.
Auf dem Client:
Von nun an wirst du von dem Client aus nicht mehr nach dem SSH-Anmeldepasswort gefragt (zumindest solange du OpenSSH verwendest).
Auf dem Client:
- Schlüsselpaar erzeugen 1
ssh-keygen -N '""' -t ed25519 -f "$HOME\.ssh\id_ed25519"
- Öffentlichen Schlüssel auf Server hinterlegen 1
ssh UserName@SSHServer "mkdir -p ~/.ssh;echo '$(ssh-keygen -f "$HOME\.ssh\id_ed25519" -y)' >> ~/.ssh/authorized_keys"
- Ein letztes mal dein Anmeldepasswort eingeben
Von nun an wirst du von dem Client aus nicht mehr nach dem SSH-Anmeldepasswort gefragt (zumindest solange du OpenSSH verwendest).
da warst du zu flott, ich hatte es oben noch mal angepasst (der Parameter "-y" muss hinter den Pfad). Führe den 2. Befehl oben noch mal aus.
Zitat von @ASMFreak:
Hallo Crusher79,
auch Dir herzlichen Dank für Deine Geduld mit mir und Deine Versuche, meine Probleme lösen zu helfen.
Gruß,
ASMFreak
Hallo Crusher79,
auch Dir herzlichen Dank für Deine Geduld mit mir und Deine Versuche, meine Probleme lösen zu helfen.
Gruß,
ASMFreak
Warchguard geht damit auch. Ist nur CLI ohne Linux bash.
Es müsste also auch nur dsm gehen.
Andere für dsm nehmen putty und erlauben es in sudoer.
Hat man ein Linux prompt, muss man kein home haben. Man kann bei dsm Home für User aktivieren. Ohne home fehlt einen der Ordner.