ubuntuusers.de

SSH Verbindung über Shellskript erstellen

Status: Ungelöst | Ubuntu-Version: Ubuntu 9.10 (Karmic Koala)
Antworten |

dbuehler

Anmeldungsdatum:
25. November 2009

Beiträge: Zähle...

Hi,

ich würde gern zur Remoteadministration eines Intranet Webservers, auf den ich übers Internet nur über SSH Zugriff habe (kann also ohne weiteres nicht mal die Webseiten anschauen) ein Shellskript haben, dass mich automatisch einloggt. Anstehen würde dann: -port-tunneling per SSH, damit ich lokal Zugriff auf die Webseiten habe -sshfs, um auf das /www/ Verzeichnis möglichst komfortabel zugreifen zu können -ssh normal, falls ich während meiner Arbeiten mal den mysqld oder dergleichen restarten muss.

Nachdem ich das normale SSH Terminal mit exit beendet habe, würde ich gern die anderen Jobs auch beenden.

Mein Problem ist nun, dass alle 3 oben genannten Befehle nach der Eingabe nach einem Passwort verlangen und da dieses jedes mal das selbe ist, würde ich es gern einmal am anfang des Skripts definieren und dann immer verwenden. Allerdings habe ich keine Ahnung wie ich das in einem Shellskript mache. Zudem sollte ich den tunneling job in den background schicken, und auch da weiß ich nicht wie ich das machen soll.

hier mal so n kleiner Draft des Skripts. Funktioniert natürlich nicht, ich hab die fehlenden Stellen immer per Kommentar kenntlich gemacht.

#!/bin/bash

read server
# example values (user and pass are known and do not change):
#server="192.168.0.1"
user="foo"
pass="bar"

echo "Establishing connection to ${user}@${server}"
# Webserver tunneling
ssh -L 8000:localhost:80 ${user}@${server} -N
#password here
#send to background
echo "Webserver tunneling done ( use http://localhost:8000)"
# Filesystem mounting
sshfs ${user}@${server}:/var/www/ ~/fusessh
#password here
echo "Remote Filesystem mountet to ~/fusessh"
# SSH
ssh ${user}r@${server}
#password here

#work here as long as ssh is open

# close connections
fusermount -u ~/fusessh/
#some way to close tunneling needed here

echo "All connections closed succsessfully"

exit 0

Ich bin noch ein ziemlicher Neuling in Linux Dingen und hab mich recht schnell Hals über Kopf in (für mich) relativ tief liegende Themen gestürzt. Bin für jeden Lösungsansatz und Hinweis auf Cerebralflatulenz dankbar.

MfG Daniel

dbuehler

(Themenstarter)

Anmeldungsdatum:
25. November 2009

Beiträge: 11

Hi,

mein Skript funktioniert jetzt soweit, ein Blick ins manual war mal wieder hilfreich. Eine Sache ist aber immernoch ärgerlich: ich muss das selbe Passwort 3 mal eingeben. Gibts nicht irgend eine Möglichkeit, das zu automatisieren?

Mein Skript sieht jetzt so aus:

#!/bin/bash

# some arbitary values
server="192.168.1.1"
user="foo"
pass="bar"

echo
echo "Establishing connection to ${user}@${server}..."
echo

# Webserver tunneling
echo "Webserver tunneling setup..."
ssh -L 8000:localhost:80 ${user}@${server} -N -f
#password here
echo "Webserver tunneling done ( use http://localhost:8000)"
echo

# Filesystem mounting
echo "Mounting remote filesystem..."
sshfs ${user}@${server}:/var/www/ ~/fusessh
#password here
echo "Remote Filesystem mountet to ~/fusessh"
echo

# SSH
ssh ${user}@${server}
#password here
#work here as long as ssh is open


# close connections
echo
echo "SSH connection closed."
fusermount -u ~/fusessh/
echo "Remote filesystem unmounted."
killall ssh	#rethink me
echo "Webserver tunnel closed."
echo
echo "All connections closed succsessfully"

exit 0

Alles was jetzt noch fehlt ist eine sinnvolle Ersetzung von "#password here". Ich wäre sehr dankbar für Hilfe, da muss es doch irgend eine Möglichkeit geben.

MfG Daniel

[edit] killall ssh ist nicht wirklich schön. Wie kann ich mir denn die pid des Jobs "ssh -L 8000:localhost:80 ${user}@${server} -N -f" in eine Variable speichern? Habe schon durch diverse Skripting Tutorials gestöbert, da das ja eigentlich relativ grundlegend ist, habs aber nicht gefunden.

NoKurth

Avatar von NoKurth

Anmeldungsdatum:
18. August 2006

Beiträge: 430

Hallo Daniel.

dbuehler schrieb:

[...] Alles was jetzt noch fehlt ist eine sinnvolle Ersetzung von "#password here". [...]

Eine Möglichkeit, bei SSH Passwörter automatisiert einzutragen, habe ich auch ewig gesucht - und keine gefunden. Deshalb fällt mir nur diese Lösung hier ein.

Gruß Norman

lin-x

Anmeldungsdatum:
1. Juli 2008

Beiträge: 25

Hi,

sagt Dir expect etwas? Ich hab hier mal ein Link. Damit sollte es klappen

http://www.pro-linux.de/news/2004/7035.html

dbuehler

(Themenstarter)

Anmeldungsdatum:
25. November 2009

Beiträge: 11

Hi,

expect ist super, genau was ich gesucht habe. Leider scheine ich zu doof dafür zu sein.

Mein expect-file sieht so aus:

#!/usr/bin/expect

log_user 0

set host [lindex $argv 0]
set user [lindex $argv 1]
set pass [lindex $argv 2]

spawn -noecho "ssh -L 8000:localhost:80 ${user}@${host} -N -f"
expect "password" { send "$pass" }

ich will Username und Passwort gern als Parameter übergeben (macht hier noch keinen Sinn, aber das Skript is ja noch net vollständig). Leider funktioniert das nicht, da er mir sagt er findet ssh nicht. Kein Problem dacht ich mir, wird schon irgendwo liegen das Programm. Ich kanns aber nicht finden. Noch eine clevere Idee? ☺ Ich hab auch schon versucht sowas wie:

expect "$" {send "ssh -L 8000:localhost:80 ${user}@${host} -N -f"}

zu machen, das sollte immer wahr sein ($ ist bei mir das prompt), und er sollte den Befehl dann normal in der Shell ausführen. Tut er aber nicht.

MfG Daniel

NoKurth

Avatar von NoKurth

Anmeldungsdatum:
18. August 2006

Beiträge: 430

Hallo Daniel.

dbuehler schrieb:

[...] da er mir sagt er findet ssh nicht. [...]

Im verlinkten Artikel von lin-x sieht es so aus, als ob du den vollständigen Pfad angeben musst. Um heraus zu finden, wo ein Programm liegt, tippst du in einer Shell

1
which <Programm>

ein. In deinem Fall also

1
which ssh

Gruß Norman

dbuehler

(Themenstarter)

Anmeldungsdatum:
25. November 2009

Beiträge: 11

Hi,

super, jetzt weis ich wo die ssh steckt. bringt mich weiter, aber leider nicht so viel wie ich dachte ☹

Mein Skript sieht jetzt so aus : (Skript heist Srv.sh)

#!/usr/bin/expect

#ssh -L 8000:localhost:80 ${user}@${server} -N -f
#sshfs ${user}@${server}:/var/www/ ~/fusessh
#ssh ${user}@${server}

log_user 0

set host [lindex $argv 0]
set user [lindex $argv 1]
set pass [lindex $argv 2]

spawn -noecho "/usr/bin/ssh -L 8000:localhost:80 ${user}@${host} -N -f"
expect "password" { send "$pass" }

wenn ich das nun mit den korrekten Daten aufruf passiert folgendes:

Aufruf$:./Srv.sh RemoteHostIp foo bar

couldn't execute "/usr/bin/ssh -L 8000:localhost:80 foo@RemoteHostIp -N -f": no such file or directory
    while executing
"spawn -noecho "/usr/bin/ssh -L 8000:localhost:80 ${user}@${host} -N -f""
    (file "./Srv.sh" line 13)

Und ich verstehs nicht.

MfG Daniel

NoKurth

Avatar von NoKurth

Anmeldungsdatum:
18. August 2006

Beiträge: 430

Hallo Daniel.

dbuehler schrieb:

[...]

spawn -noecho "/usr/bin/ssh -L 8000:localhost:80 ${user}@${host} -N -f"

[...]

couldn't execute "/usr/bin/ssh -L 8000:localhost:80 foo@RemoteHostIp -N -f": no such file or directory

[...]

Das sieht für mich so aus, als ob alles zwischen den Anführungszeichen als ein Befehl (nicht Befehl mit Parameter) interpretiert wird. Was passiert, wenn du die Anführungszeichen entfernst? Ich kann hier leider nur Vermutungen äußern, da ich es selbst nicht ausprobiert habe. Ich persönlich bevorzuge die Möglichkeit mit Schlüsseln (siehe mein erster Post zum Thema).

Gruß Norman

Antworten |