# [shh] SSH Befehle in einem Script?

## 3PO

Hallo Zusammen,

ich möchte verschiedene Befehle auf einem Remote-PC via SHH abarbeiten lassen.

Ich logge mich via RSA-Key ein, was auch funktioniert.

Wenn ich auf der Console folgendes eingebe:

```
ssh <IP_DES_REMOTE-PC>

<BEFEL_1>

<BEFEL_2>

<BEFEL_3>

<BEFEL_4>

logout
```

dann funktioniert das einwandfrei.

Wenn ich aber das ganze nun in ein Script packe und  aufrufe, dann geht das nicht:

```
#!/bin/bash

ssh <IP_DES_REMOTE-PC>

<BEFEL_1>

<BEFEL_2>

<BEFEL_3>

<BEFEL_4>

logout

exit
```

Was mache ich falsch?

----------

## manuels

die BEFEHLE_X werden auf deinem lokalen Rechner ausgeführt, sobald du das SSH-Programm wieder schließt.

Du müsstest in etwa so das hier starten

```
ssh IP_NUMMER "BEFEHL_1 && BEFEHL_2 && ..."
```

EDIT: IP vergessen

----------

## 3PO

Geht leider auch nicht.  :Sad: 

----------

## Evildad

Ein paar Ausgaben sind hier sicher recht sinnvoll.

Was genau passiert denn wenn Du das Skript ausführst?

Grüsse

----------

## 3PO

 *Evildad wrote:*   

> Ein paar Ausgaben sind hier sicher recht sinnvoll.
> 
> Was genau passiert denn wenn Du das Skript ausführst?
> 
> Grüsse

 

Ich möchte damit eine VM auf einem Server starten:

```
vdr01 ~ # /var/epg/getepg/startVM_onServer.sh

Last login: Sat May 15 18:49:01 CEST 2010 from vdr01 on ssh

Server ~ # logout

Connection to server closed.

/var/epg/VMrun.sh: line 11: vmrun: command not found

bash: line 0: logout: not login shell: use `exit'

vdr01 ~ # /var/epg/getepg/startVM_onServer.sh
```

Die "startVM_onServer.sh" sieht so aus:

```
#!/bin/bash

EPG_SERVER="server"

ssh $EPG_SERVER "/var/epg/VMrun.sh start && logout"

exit
```

----------

## tazinblack

Also was Du auch machen kannst:

Du erstellst auf dem Zielrechner ein "Startskript" für die VM(s) und rufst dieses dann per SSH aus der Ferne auf.

Das finde ich oft einfacher. Denn bei einer Befehlskette per SSH passieren mir auch immer wieder Fehler.

Ich offe das kommt für Dich in Frage.

----------

## Evildad

Also das funktioniert bei mir:

```

ssh root@<ip> "free -m  && df -h "
```

Logout musst Du durch exit ersetzen, dann ist die Fehlermeldung weg

 *Quote:*   

> bash: line 0: logout: not login shell: use `exit' 

 

----------

## 3PO

 *Evildad wrote:*   

> Also das funktioniert bei mir:
> 
> ```
> 
> ssh root@<ip> "free -m  && df -h "
> ...

 

Das funktioniert bei mir auch, wenn ich es von der Console aus aufrufe, aber packe das doch mal in Script und Du wirst sehen, dass dann nicht geht.

----------

## Evildad

Da muss ich Dich leider enttäuschen...

```
./test.sh 

             total       used       free     shared    buffers     cached

Mem:           ...

-/+ buffers/cache:        ...

Swap:           ...

Filesystem            Size  Used Avail Use% Mounted on

simfs                 ...

```

Als welcher User rufst Du das denn auf und wem gehört der RSA-KEY?

Der einzige Unterschied ist, dass ich ssh root@<ip> und Du ssh <ip> benutzt und der Key

----------

## 3PO

Lustiger Weise geht das bei mir auch:

/tmp/test.sh:

```
#!/bin/bash

ssh server "free -m  && df -h "
```

```
vdr01 ~ # /tmp/test.sh

             total       used       free     shared    buffers     cached

Mem:          2015       1013       1001          0         60        794

-/+ buffers/cache:        158       1856

Swap:         5726         52       5673

Filesystem            Size  Used Avail Use% Mounted on

/dev/sda3             142G   32G  103G  24% /

udev                   10M  208K  9.8M   3% /dev

/dev/sda1              54M  8.1M   43M  17% /boot

vdr01 ~ #
```

Allerdings existeren die Befehle "free" und "df" auch auf beiden Systemen, wärend es "vmrun" bei mir nur auf dem Server gibt.

----------

## Evildad

Dann pack noch ein uname mit rein dann weisst wo der Befehl ausgeführt wird.

Bei mir waren es definitiv die Daten vom Zielserver.

Oder sind Deine Daten die des Zielservers?

----------

## 3PO

 *Evildad wrote:*   

> [...] Oder sind Deine Daten die des Zielservers?

 

Ja, sind die Daten des Zielrechners.

----------

## manuels

was ist denn die Ausgabe, wenn du

 *Quote:*   

> ssh <user>@<ip> "/var/epg/VMrun.sh start"

 startest?

----------

## 3PO

 *manuels wrote:*   

> was ist denn die Ausgabe, wenn du
> 
>  *Quote:*   ssh <user>@<ip> "/var/epg/VMrun.sh start" startest?

 

Dann kommt das:

```
vdr01 ~ # ssh root@server "/var/epg/VMrun.sh start"

/var/epg/VMrun.sh: line 11: vmrun: command not found

vdr01 ~ #
```

Einzeln gehen die Befehle aber auf der Console:

```
vdr01 ~ # ssh root@server

Last login: Sat May 15 23:25:09 CEST 2010 from vdr01 on ssh

Server ~ # /var/epg/VMrun.sh start

Server ~ # logout

Connection to server closed.

vdr01 ~ #
```

Nur eben aus einem Script heraus nicht.

----------

## py-ro

Ich wette in deinem vmrun Skript sind keine absoluten Pfade angegeben. Geb die bitte mal an.

Py

----------

## 3PO

 *py-ro wrote:*   

> Ich wette in deinem vmrun Skript sind keine absoluten Pfade angegeben. Geb die bitte mal an.
> 
> Py

 

Wette gewonnen!   :Laughing: 

Genau daran hat es gelegen.

Das Script auf dem Server sah so aus:

```
#!/bin/bash

USER="root"

PASS="geheim"

VM="Windows XP Professional/Windows XP Professional.vmx"

case $1 in

     start)

      vmrun -T server -h 'https://localhost:8333/sdk' -u $USER -p $PASS start "[standard] ""$VM"

     ;;

     stop)

      vmrun -T server -h 'https://localhost:8333/sdk' -u $USER -p $PASS stop "[standard] ""$VM"

     ;;

     list)

      vmrun -T server -h 'https://localhost:8333/sdk' -u $USER -p $PASS list

     ;;

esac
```

Nachdem ich es geändert habe in:

```
#!/bin/bash

USER="root"

PASS="geheim"

VM="Windows XP Professional/Windows XP Professional.vmx"

case $1 in

     start)

      /opt/vmware/server/lib/bin/vmrun -T server -h 'https://localhost:8333/sdk' -u $USER -p $PASS start "[standard] ""$VM"

     ;;

     stop)

      /opt/vmware/server/lib/bin/vmrun -T server -h 'https://localhost:8333/sdk' -u $USER -p $PASS stop "[standard] ""$VM"

     ;;

     list)

      /opt/vmware/server/lib/bin/vmrun -T server -h 'https://localhost:8333/sdk' -u $USER -p $PASS list

     ;;

esac
```

geht es nun.

1000 THX für die Hilfe.   :Wink: 

----------

## 3PO

Übrigens,

mehrere Befehle hintereinader ausführen geht z.b. so:  :Wink: 

```
#!/bin/bash

ssh server "free -m"  

ssh server "df -h"

ssh server "uname -a"
```

----------

## py-ro

Folgendes geht definitiv auch.

```
ssh server 'free -m ; df -h ; uname -a'
```

Py

----------

## 3PO

 *py-ro wrote:*   

> Folgendes geht definitiv auch.
> 
> ```
> ssh server 'free -m ; df -h ; uname -a'
> ```
> ...

 

Natülich, aber wenn es dann mal 20 oder mehr Kommandos sind, dann wird halt die Zeile doch etwas lang.

----------

## 69719

 *3PO wrote:*   

> Übrigens,
> 
> mehrere Befehle hintereinader ausführen geht z.b. so: 
> 
> ```
> ...

 

Kann man auch mittels

```

#!/bin/bash

ssh user@server "

cmd1

cmd2

cmd3

...

cmd20

" 

```

lösen.

----------

## schachti

 *3PO wrote:*   

>  *py-ro wrote:*   Folgendes geht definitiv auch.
> 
> ```
> ssh server 'free -m ; df -h ; uname -a'
> ```
> ...

 

Besser, als 20 Mal hintereinander eine ssh-Verbindung zu öffnen und wieder zu schließen - das müllt die Logs voll.   :Wink: 

----------

## Tinitus

 *schachti wrote:*   

>  *3PO wrote:*    *py-ro wrote:*   Folgendes geht definitiv auch.
> 
> ```
> ssh server 'free -m ; df -h ; uname -a'
> ```
> ...

 

Hallo,

habe Euren Thread mal ausgegraben. Leider kann ich in meinem Script kein Paßwort mit übergeben. Lt. Manpage gibt es keine -u -p Option bei ssh.. Ist das richtig? Wie macht ihr das? Paßwort jedes mal per Hand. Mit Schlüsseldateien ist das ein wenig lästig, da ständig neue Rechner mit gleicher IP hier aufschlagen.

G. Roland

----------

## 3PO

@ Tinitus,

ich habe das mittlerweile mit "expect" gelöst.  :Wink: 

Info: --> http://bash.cyberciti.biz/security/expect-ssh-login-script/

----------

## Tinitus

 *3PO wrote:*   

> @ Tinitus,
> 
> ich habe das mittlerweile mit "expect" gelöst. 
> 
> Info: --> http://bash.cyberciti.biz/security/expect-ssh-login-script/

 

Hallo,

Danke für die Antwort. Welches gentoo Paket enthält das expect?

Warum unterstützt ssh keine Username und Paßwortangaben mehr?

G. Roland

----------

## 3PO

```
dev-tcltk/expect
```

Info: http://www.nist.gov/el/msid/expect.cfm

----------

## Finswimmer

 *Tinitus wrote:*   

> 
> 
> Warum unterstützt ssh keine Username und Paßwortangaben mehr?

 

echo "passwort" | ssh -l user -z (parameter für pw über stdin) server

Das habe ich eben im Internet gefunden.

Die Man-Page verrät noch, dass man ssh user@hostname machen kann.

Tobi

----------

## slick

Gleiches Thema hatten wir doch erst vor kurzem: https://forums.gentoo.org/viewtopic-t-866029.html

@Mod, mergen erscheint mir recht sinnvoll

----------

## toralf

 *Tinitus wrote:*   

> Warum unterstützt ssh keine Username und Paßwortangaben mehr?

 Hat ssh doch noch nie getan, oder ?

----------

## misterjack

Anstatt Passwort dann doch lieber mit Keys arbeiten  :Smile: 

----------

