asmfreak

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

1
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
Auf Facebook teilen
Auf X (Twitter) teilen
Auf Reddit teilen
Auf Linkedin teilen

Content-ID: 672078

Url: https://administrator.de/forum/ssh-shutdown-mittels-skript-672078.html

Ausgedruckt am: 24.04.2025 um 13:04 Uhr

Crusher79
Crusher79 20.03.2025 um 19:02:04 Uhr
Goto Top
Hi,

klar...

https://github.com/darkoperator/Posh-SSH

1
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.
MichaMA
MichaMA 20.03.2025 um 19:21:55 Uhr
Goto Top
Auf dem Linux Server per visudo deinem User die Rechte geben den Befehl ohne password auszuführen, so ungefähr:

1
USERNAME ALL= NOPASSWORD /bin/shutdown 

Dann reicht ein
1
sudo shutdown -h now

Oder ein
1
ssh username@servername "sudo shutdown -h now"  

Musst aber die Pfade prüfen
TK1987
TK1987 20.03.2025 um 19:25:49 Uhr
Goto Top
Moin,

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...
1
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
TK1987
TK1987 20.03.2025 aktualisiert um 19:28:09 Uhr
Goto Top
Moin,

unnötig. Der OpenSSH-Client ist längst standardmäßig in Windows vorhanden.

Gruß Thomas
Crusher79
Crusher79 20.03.2025 um 19:39:46 Uhr
Goto Top
Zitat von @TK1987:

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?
ASMFreak
ASMFreak 20.03.2025 um 20:29:35 Uhr
Goto Top
Hallo Crusher79,

Danke für den Code. Ich habe nur die Varablennamen an die in meinem Skript angepasst, die schon da sind. Fehlermeldungen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
Import-Module : Das angegebene Modul "posh-ssh" wurde nicht geladen, da in keinem Modulverzeichnis eine gültige  
Moduldatei gefunden wurde.
In I:\Skripte\ShutDownMitPowerShell\Test.ps1:12 Zeichen:5
+     Import-Module -Name posh-ssh
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ResourceUnavailable: (posh-ssh:String) [Import-Module], FileNotFoundException
    + FullyQualifiedErrorId : Modules_ModuleNotFound,Microsoft.PowerShell.Commands.ImportModuleCommand

New-Object : Für "PSCredential" und die folgende Argumenteanzahl kann keine Überladung gefunden werden: "2".  
In I:\Skripte\ShutDownMitPowerShell\Test.ps1:21 Zeichen:20
+ ... tialLinux = New-Object System.Management.Automation.PSCredential ($Us ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [New-Object], MethodException
    + FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand

New-SSHSession : Die Benennung "New-SSHSession" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei  
oder eines ausführbaren Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist
(sofern enthalten), und wiederholen Sie den Vorgang.
In I:\Skripte\ShutDownMitPowerShell\Test.ps1:22 Zeichen:20
+ $linuxSSHsession = New-SSHSession -ComputerName $sshserver -Credentia ...
+                    ~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (New-SSHSession:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

New-SSHShellStream : Die Benennung "New-SSHShellStream" wurde nicht als Name eines Cmdlet, einer Funktion, einer  
Skriptdatei oder eines ausführbaren Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad
korrekt ist (sofern enthalten), und wiederholen Sie den Vorgang.
In I:\Skripte\ShutDownMitPowerShell\Test.ps1:23 Zeichen:16
+ $streamLinux = New-SSHShellStream -SessionId $linuxSSHsession.Session ...
+                ~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (New-SSHShellStream:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

Invoke-SSHStreamExpectAction : Die Benennung "Invoke-SSHStreamExpectAction" wurde nicht als Name eines Cmdlet, einer  
Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt. Überprüfen Sie die Schreibweise des Namens,
oder ob der Pfad korrekt ist (sofern enthalten), und wiederholen Sie den Vorgang.
In I:\Skripte\ShutDownMitPowerShell\Test.ps1:24 Zeichen:1
+ Invoke-SSHStreamExpectAction -ShellStream $streamLinux -Command "$com ...  
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (Invoke-SSHStreamExpectAction:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

Remove-SSHSession : Die Benennung "Remove-SSHSession" wurde nicht als Name eines Cmdlet, einer Funktion, einer  
Skriptdatei oder eines ausführbaren Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad
korrekt ist (sofern enthalten), und wiederholen Sie den Vorgang.
In I:\Skripte\ShutDownMitPowerShell\Test.ps1:25 Zeichen:20
+ $linuxSSHsession | Remove-SSHSession
+                    ~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (Remove-SSHSession:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

Gruß,
ASMFreak
ASMFreak
ASMFreak 20.03.2025 um 20:33:55 Uhr
Goto Top
Hallo Thomas,

Danke. auch bei Dir Fehlermeldungen, mit denen ich nicht klarkomme face-smile :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
In I:\Skripte\ShutDownMitPowerShell\Test.ps1:9 Zeichen:6
+ cat << -- |sudo tee /etc/sudoers.d/010_allow_shutdown
+      ~
Dateispezifikation nach dem Umleitungsoperator fehlt.
In I:\Skripte\ShutDownMitPowerShell\Test.ps1:9 Zeichen:5
+ cat << -- |sudo tee /etc/sudoers.d/010_allow_shutdown
+     ~
Der Operator "<" ist für zukünftige Versionen reserviert.  
In I:\Skripte\ShutDownMitPowerShell\Test.ps1:9 Zeichen:7
+ cat << -- |sudo tee /etc/sudoers.d/010_allow_shutdown
+       ~
Dateispezifikation nach dem Umleitungsoperator fehlt.
In I:\Skripte\ShutDownMitPowerShell\Test.ps1:9 Zeichen:6
+ cat << -- |sudo tee /etc/sudoers.d/010_allow_shutdown
+      ~
Der Operator "<" ist für zukünftige Versionen reserviert.  
    + CategoryInfo          : ParserError: (:) [], ParseException
    + FullyQualifiedErrorId : MissingFileSpecification

Gruß, ASMFreak
ASMFreak
ASMFreak 20.03.2025 um 20:36:32 Uhr
Goto Top
Hallo MichaMA,

läuft auf den Vorschlag von TK1987 hinaus. Danke auch Dir.

Gruß,
ASMFreak
Crusher79
Crusher79 20.03.2025 um 21:00:55 Uhr
Goto Top
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.

1
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.
TK1987
TK1987 20.03.2025, aktualisiert am 21.03.2025 um 08:17:30 Uhr
Goto Top
Zitat von @ASMFreak:
Danke. auch bei Dir Fehlermeldungen, mit denen ich nicht klarkomme face-smile :
Das musst du natürlich auch auf dem Server ausführen.
Crusher79
Crusher79 20.03.2025 aktualisiert um 21:15:30 Uhr
Goto Top
So ich habs...

1
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
$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 
Crusher79
Crusher79 20.03.2025 aktualisiert um 21:23:29 Uhr
Goto Top
@ASMFreak

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.
Crusher79
Crusher79 20.03.2025 um 21:29:49 Uhr
Goto Top
Noch ein Nachtrag:

1
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..............
mbehrens
mbehrens 20.03.2025 um 22:40:31 Uhr
Goto Top
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?
Crusher79
Crusher79 20.03.2025 um 23:03:01 Uhr
Goto Top
Zitat von @mbehrens:

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.
ASMFreak
ASMFreak 21.03.2025 um 11:47:12 Uhr
Goto Top
Hallo Crusher79,

vielen Dank für Deine Geduld! Schlechte Nachtichten:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
PS C:\WINDOWS\system32> I:\Skripte\ShutDownMitPowerShell\Test2.ps1
New-SSHSession : Die Benennung "New-SSHSession" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt.   
Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist (sofern enthalten), und wiederholen Sie den Vorgang.
In I:\Skripte\ShutDownMitPowerShell\Test2.ps1:10 Zeichen:20
+ $linuxSSHsession = New-SSHSession -ComputerName $SshServer -Credentia ...
+                    ~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (New-SSHSession:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException
 
New-SSHShellStream : Die Benennung "New-SSHShellStream" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt.   
Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist (sofern enthalten), und wiederholen Sie den Vorgang.
In I:\Skripte\ShutDownMitPowerShell\Test2.ps1:11 Zeichen:16
+ $streamLinux = New-SSHShellStream -SessionId $linuxSSHsession.Session ...
+                ~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (New-SSHShellStream:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException
 
Invoke-SSHStreamExpectSecureAction : Die Benennung "Invoke-SSHStreamExpectSecureAction" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines   
ausführbaren Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist (sofern enthalten), und wiederholen Sie den Vorgang.
In I:\Skripte\ShutDownMitPowerShell\Test2.ps1:14 Zeichen:1
+ Invoke-SSHStreamExpectSecureAction -ShellStream $streamLinux -Command ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (Invoke-SSHStreamExpectSecureAction:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException
 
Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat.
In I:\Skripte\ShutDownMitPowerShell\Test2.ps1:17 Zeichen:1
+ $streamLinux.Read()
+ ~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
 
Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat.
In I:\Skripte\ShutDownMitPowerShell\Test2.ps1:19 Zeichen:1
+ $streamLinux.Close()
+ ~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
 
Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat.
In I:\Skripte\ShutDownMitPowerShell\Test2.ps1:20 Zeichen:1
+ $streamLinux.Dispose()
+ ~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
 
Remove-SSHSession : Die Benennung "Remove-SSHSession" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt.   
Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist (sofern enthalten), und wiederholen Sie den Vorgang.
In I:\Skripte\ShutDownMitPowerShell\Test2.ps1:22 Zeichen:20
+ $linuxSSHsession | Remove-SSHSession
+                    ~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (Remove-SSHSession:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException
 

PS C:\WINDOWS\system32> 

Gruß,
ASMFreak
ASMFreak
ASMFreak 21.03.2025 um 11:54:07 Uhr
Goto Top
Hallo Thomas,

aus einer Powershell heraus bekomme ich

1
2
PS I:\Skripte\ShutDownMitPowerShell> .\Test.ps1
ssh: Could not resolve hostname sshserver: Der angegebene Host ist unbekannt.

; ich kann den Server aber anpingen. Und aus einer CMD

1
2
3
4
5
6
7
D:\>ssh UserName@SSHServer "echo 'SUsername ALL=(ALL) NOPASSWD: /usr/sbin/poweroff' | sudo tee /etc/sudoers.d/010_allow_shutdown"  
The authenticity of host 'SSHServer (192.39.43.166)' can't be established.  
ED25519 key fingerprint is SHA256:o/jgMdx9Nl7QvNoSfwAB8iQAC1Iw3X1lQTOEREtaTZo.
This key is not known by any other names.
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:  

er verlangt also weiterhin das Passwort.

Gruß,
ASMFreak
TK1987
TK1987 21.03.2025 um 12:17:04 Uhr
Goto Top
Zitat von @ASMFreak:
1
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:  
er verlangt also weiterhin das Passwort.
Jetzt redest du aber von 2 verschiedenen Dingen:

  • 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.
ASMFreak
ASMFreak 21.03.2025 um 12:25:19 Uhr
Goto Top
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.

Gruß,
ASMFreak
Crusher79
Crusher79 21.03.2025 um 12:55:46 Uhr
Goto Top
Also.... Du musst für meinen Kram dieses Posh-SSH Dingens installieren!

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
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!
Crusher79
Crusher79 21.03.2025 um 13:08:19 Uhr
Goto Top
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.

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!
TK1987
TK1987 21.03.2025 aktualisiert um 13:11:27 Uhr
Goto Top
Zitat von @ASMFreak:
Danke, TK1987, das wird mit zu kompliziert mit Schlüsselpaar
Daran ist überhaupt nichts kompliziert.

Auf dem Client:

  1. Schlüsselpaar erzeugen
    1
    ssh-keygen -N '""' -t ed25519 -f "$HOME\.ssh\id_ed25519"  
  2. Ö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"  
  3. 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).
ASMFreak
ASMFreak 21.03.2025 um 13:10:53 Uhr
Goto Top
Hallo Crusher79,

Posh-SSH war installiert! Geht trotzdem nicht, auch wenn Dein Ubuntu Laptop spurt face-wink

Gruß,
ASMFreak
ASMFreak
ASMFreak 21.03.2025 um 13:29:41 Uhr
Goto Top
Hallo TK1987,

das erste hat geklappt, beim zweiten sagt er

1
2
3
PS I:\Skripte\ShutDownMitPowerShell> ssh UserName@SSHServer "mkdir -p ~/.ssh;echo '$(ssh-keygen -f -y "$HOME\.ssh\id_ed25519")' >> ~/.ssh/authorized_keys"  
Too many arguments.
u

sowie, nach Passwort-Eingabe,

1
2
3
4
UserName@SSHServer's password:  
Could not chdir to home directory /var/services/homes/DeviceAdmin: No such file or directory
mkdir: cannot create directory '/var/services/homes': File exists  
sh: /var/services/homes/UserName/.ssh/authorized_keys: No such file or directory

Ich vermute, er will hier das Schlüsselpaar ablegen. Ich hatte aber bewusst dem Account keinen Zugriff auf das Filesystem gegeben. Das würde den Fehler erklären. Leider kenne ich mich mit Linux (hier: DSM) zu wenig aus, um das gewünschte Verzeichnis manuell zu erstellen und ihm darauf und nur darauf Zugriff zu erlauben.
TK1987
TK1987 21.03.2025 um 14:18:52 Uhr
Goto Top
Zitat von @ASMFreak:
... beim zweiten sagt er
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.
ASMFreak
ASMFreak 21.03.2025 aktualisiert um 16:39:03 Uhr
Goto Top
Ändert nichts:

1
2
3
4
5
PS I:\Skripte\ShutDownMitPowerShell> ssh UserName@SSHServer "mkdir -p ~/.ssh;echo '$(ssh-keygen -f "$HOME\.ssh\id_ed25519" -y)' >> ~/.ssh/authorized_keys"  
UserName@SSHServer's password:  
Could not chdir to home directory /var/services/homes/UserName: No such file or directory
mkdir: cannot create directory '/var/services/homes': File exists  
sh: /var/services/homes/UserName/.ssh/authorized_keys: No such file or directory

1
2
PS I:\Skripte\ShutDownMitPowerShell> ssh UserName@SSHServer '/usr/bin/sudo /usr/sbin/poweroff'  
UserName@SSHServer's password:  

Liegt das nicht daran, dass das Verzeichnis, das er sucht und versucht einzurichten, nicht existiert?`Wie kann ich es in DSM manuell einrichten (Pfad!)?

Edit: Ich habe via DSM den Benutzer-Home-Dienst aktiviert und den ersten Befehl oben nochmals ausgeführt. Danach habe ich Deinen Befehl zum ShtuDown ausgeführt:

1
2
3
4
PS I:\Skripte\ShutDownMitPowerShell> ssh UserName@SSHServer '/usr/bin/sudo /usr/sbin/poweroff'  
sudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper
sudo: a password is required
P

Nochmals Edit: Auch mit Option -s geht's nicht:

1
2
PS I:\Skripte\ShutDownMitPowerShell> ssh UserName@SSHServer -s '/usr/bin/sudo /usr/sbin/poweroff'  
subsystem request failed on channel 0


Gruß,
ASmFreak
DivideByZero
DivideByZero 22.03.2025 um 14:48:11 Uhr
Goto Top
Moin,

da Du DSM erwähnst, möchtest Du wohl eine Synology remote herunterfahren. Da solltest Du nicht nach Server allgemein fragen, sondern im Synology-Forum nachsehen, dort gbt es verschiedene Lösungen, über SSH, über PHP/URL-Aufruf.

Gruß

DivideByZero
ASMFreak
ASMFreak 23.03.2025 um 01:17:07 Uhr
Goto Top
Hallo DivideByZero,

Danke für den Tipp! Ja, ich probiere das Ganze zunächst an einer NAS aus, da ich mich bislang gescheut habe, das Ganze an eienm Linux-Server zu lernen. Da ich mit Linux praktisch keine Erfahrung habe, hatte ich Naivling angenommen, dass solche grundlegenden Dinge wie SSH auf allen Linux-Versionen und damit auch DSM analog ablaufen. Etwas dazugelernt!
Ich werde mich also zunächst im DSM-Forum tummeln, versuchen das dann mit der NAS hinzubekommen, und dann meine neuen Erkenntnisse auf einen neu aufzubauenden Linux-Server anzuwenden.

Nochmals Danke und Gruß,
ASMFreak
ASMFreak
ASMFreak 23.03.2025 um 01:20:15 Uhr
Goto Top
Hallo TK1978

DevideByZero hat mich darauf aufmerksam gemacht, das stimmt, was ich inzwischen schon angenommen hatte: DSM scheint etwas anders gestrickt zu sein.

Auf jeden Fall möchte ich Dir für Deine Geduld, Mühe und Hilfe danken.
Gruß,
ASMFreak
ASMFreak
ASMFreak 23.03.2025 um 01:22:05 Uhr
Goto Top
Hallo Crusher79,

auch Dir herzlichen Dank für Deine Geduld mit mir und Deine Versuche, meine Probleme lösen zu helfen.
Gruß,
ASMFreak
Crusher79
Crusher79 23.03.2025 um 10:27:41 Uhr
Goto Top
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

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.