ubuntuusers.de

ssh zugriff und auslesen eines String

Status: Gelöst | Ubuntu-Version: Ubuntu 18.04 (Bionic Beaver)
Antworten |

jnpanzer

Anmeldungsdatum:
24. Januar 2022

Beiträge: 19

Hallo zusammen,

Ich versuch mich gerade an einen Shell Script und habe 3 kleine Probleme.

1. Problem mit der SED

1
2
3
4
5
6
7
8
9

#/bin/sh
IP="192.168.178.100"
PW="paswword"
BN="user"


SW=$(sshpass -p $PW ssh $BN@$IP -p 22 -t "sed -n -e \"s/.*SwVersionTerminal=\(.*\)\ SerialNo.*/\1/p\" /tmp/status.dat")
echo $SW

führe ich den Code Zeile im Linux direkt aus kommt die richtige Anzeige

"27.22.12"

führe ich das im Shell Script aus kommt die Anzeige

"27.22.12"inycorelinux.comth ABSOLUTELY NO WARRANTY.

Habt Ihr für mich eine kleinen Tipp

2. Problem Ich versuch die Anführungsziechen wegzubekommen bei "27.22.12"

1
2
3
4
5
6
7
8

#/bin/sh
IP="192.168.178.100"
PW="paswword"
BN="user"


SW=$(sshpass -p $PW ssh $BN@$IP -p 22 -t "sed -n -e \"s/.*SwVersionTerminal=\"\(.*\)\ \" SerialNo.*/\1/p\" /tmp/status.dat")

Ich hab versucht die Anführungszeichen zu Escapen das mag er aber nicht.

3. Problem Wenn ich mit SSH einloggen will kommt beim ersten mal diese Abfrage

1
2
3
4
root@intranet3:/bin# ssh user@192.168.178.1
The authenticity of host '62.202.40.1 (62.202.40.1)' can't be established.
RSA key fingerprint is SHA256:kKShxdHp4crvB2GLNnRLsP28D2/6Kbvxp/Dq7SiNgxU.
Are you sure you want to continue connecting (yes/no)?

kan man diese umgehen?

Ich will das Script bei 200 Systeme einsetzten.

lubux

Anmeldungsdatum:
21. November 2012

Beiträge: 14350

jnpanzer schrieb:

führe ich den Code Zeile im Linux direkt aus kommt die richtige Anzeige

"27.22.12"

führe ich das im Shell Script aus kommt die Anzeige

"27.22.12"inycorelinux.comth ABSOLUTELY NO WARRANTY.

Wie ist die Ausgabe von:

sh -x <Shell-Script>

?

EDIT:

Dein 3. Problem kannst Du mit einem rechtzeitigen bzw. entsprechenden Eintrag in der zuständigen "~/.ssh/known_hosts", umgehen. Das ist ein berechtigtes Sicherheitsfeature von ssh (gegen MITM-Angriff).

jnpanzer

(Themenstarter)

Anmeldungsdatum:
24. Januar 2022

Beiträge: 19

Hallo lubux

Ausgabe bei sh -x <Shell-Script>

1
2
3
"27.22.12"
 "27.22.12"inycorelinux.comth ABSOLUTELY NO WARRANTY.
 "27.22.12"inycorelinux.comth ABSOLUTELY NO WARRANTY.

Zu Punkt 3 Danke für die Info, ich mache die Einträge in der ~/.ssh/known_host Bei mir ist es ein "Intranet" desahlb wollte ich das vernachlässigen,

lubux

Anmeldungsdatum:
21. November 2012

Beiträge: 14350

jnpanzer schrieb:

"27.22.12"
 "27.22.12"inycorelinux.comth ABSOLUTELY NO WARRANTY.
 "27.22.12"inycorelinux.comth ABSOLUTELY NO WARRANTY.

Ist das die exakte Ausgabe?

jnpanzer

(Themenstarter)

Anmeldungsdatum:
24. Januar 2022

Beiträge: 19

Sorry

Das ist die korrekte Ausgabe in Putty nachdem ich das Script mit "sh -x" ausgeführt habe. Die erste Ausgabe passt "27.22.12".

wieso fügt er in der Var SW den Text hinzu?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
root@intranet3:/bin# sh -x T_SW_TEST.sh
+ IP=192.168.178.100
+ PW=password
+ BN=user
+ SW=
+ sshpass -p password ssh user@192.168.178.100 -p 22 -t sed -n -e "s/.*SwVersionTerminal=\(.*\)\ SerialNo.*/\1/p" /tmp/status.dat
Connection to 192.168.178.100 closed.
+ SW= (▒-
 //\   Core is distributed with ABSOLUTELY NO WARRANTY.
 v_/_           www.tinycorelinux.com

"27.22.12"
 "27.22.12"inycorelinux.comth ABSOLUTELY NO WARRANTY.
 "27.22.12"inycorelinux.comth ABSOLUTELY NO WARRANTY.
root@intranet3:/bin#

lubux

Anmeldungsdatum:
21. November 2012

Beiträge: 14350

jnpanzer schrieb:

Die erste Ausgabe passt "27.22.12" ich weis nicht wo her der Rest kommt.

+ SW= (▒-
 //\   Core is distributed with ABSOLUTELY NO WARRANTY.
 v_/_           www.tinycorelinux.com

Das wird m. E. an der Art und Weise, wie Du sed nutzt liegen. Evtl. kann dir jemand helfen, der sich mit sed auskennt.

Doc_Symbiosis

Avatar von Doc_Symbiosis

Anmeldungsdatum:
11. Oktober 2006

Beiträge: 4453

Wohnort: Göttingen

Das Checken des Hostkeys kannst Du übrigens auch so beim Aufruf von SSH ausschalten:

ssh -o StrictHostKeyChecking=no .... 

Das solltest Du aber wirklich nur einsetzen, wenn Du Dir sicher bist, was Du damit tust.

jnpanzer

(Themenstarter)

Anmeldungsdatum:
24. Januar 2022

Beiträge: 19

@Doc_Symbiosis Danke für den Tipp werde es versuchen 😉

jnpanzer

(Themenstarter)

Anmeldungsdatum:
24. Januar 2022

Beiträge: 19

Ein wenig weiter kam ich schon Ich muss wohl das SSH Login und die Eingabe trennen Kann mir jemend eine Tipp geben wie ich das trenne? So wie ich das mache geht das nicht ☹

1
2
3
4
5
6
7
8
9
#/bin/sh
IP="192.168.178.100"
PW="paswword"
BN="user"

sshpass -p $PW ssh $BN@$IP -p 22
SW=$(-t sed -n -e \"s/.*SwVersionTerminal=\(.*\)\ SerialNo.*/\1/p\" /tmp/status.dat)

echo $SW

lubux

Anmeldungsdatum:
21. November 2012

Beiträge: 14350

jnpanzer schrieb:

Ich muss wohl das SSH Login und die Eingabe trennen

In welcher Hinsicht meinst Du, Login und Eingabe trennen zu müssen? D. h., damit was funktioniert?

jnpanzer

(Themenstarter)

Anmeldungsdatum:
24. Januar 2022

Beiträge: 19

Ist nur eine Vermutung: Meinte das ich nur die Shell Kommando nach dem SSH Login in die Variable schreibe. Leider funktioniert das nicht. Könnte mir jemand einen Tipp geben wie das funktionieren müsste?

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17621

Wohnort: Berlin

lubux schrieb:

jnpanzer schrieb:

Die erste Ausgabe passt "27.22.12" ich weis nicht wo her der Rest kommt.

+ SW= (▒-
 //\   Core is distributed with ABSOLUTELY NO WARRANTY.
 v_/_           www.tinycorelinux.com

Das wird m. E. an der Art und Weise, wie Du sed nutzt liegen. Evtl. kann dir jemand helfen, der sich mit sed auskennt.

Ich habe weder sshpass, noch eine Datei /tmp/status.dat.

Könntest Du die komplette /tmp/status.dat mal zeigen? Als Ergebnis möchtest Du nur 27.22.12?

jnpanzer

(Themenstarter)

Anmeldungsdatum:
24. Januar 2022

Beiträge: 19

Inhalt der Status.dat Ergebniss steht in der SwVersionTerminal Aufbau der status.dat ist immer gleich nur die Daten in den Anführungszeichen stehen sind Variable

<?xml version="1.0" encoding="UTF-8"?>
<Terminal TerminalID="12345678" SwVersionTerminal="27.22.12" SerialNo="12345678" TerminalIP="192.168.178.121" TerminalNo="1"/>

Das sshpass ist dafür das man das Passwort bei ssh mit übergeben kann für eine Automatische Anmeldung mit ssh. Ich denke es liegt das man ich die ssh komplett in die Variable übergebe Ich müsste nur sed Kommando in die Variable übergeben nach den ssh Login,aber das bekomme ich nicht hin.

Es geht nur grep oder sed da es um ein SSH Terminal handelt mit einen abgespecketen Linux.

1. Einwahl mit ssh 2. Aufruf des sed/grep Kanmmando auf den ssh Terminal 3. exit (Logoff vom shh) 4. variable ausgeben bzw die speicher ich dann weg (das kann ich).

Da sed (einzel) Kommando geht über Kommandozeile und es passt die Aussgabe

1
2
3
4
5
6
7
#/bin/sh
IP="192.168.178.100"
PW="paswword"
BN="user"
SW=$(sshpass -p $PW ssh $BN@$IP -p 22 -t "sed -n -e \"s/.*SwVersionTerminal=\(.*\)\ SerialNo.*/\1/p\" /tmp/status.dat")
echo $SW

Hier hänge ich fest und bin für alles Tipps dankbar.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17621

Wohnort: Berlin

Ein sed-Kommando wäre:

1
sed -nr 's/.*SwVersionTerminal="([0-9.]+)".*/\1/p' /tmp/status.dat

Das -r als sed-Option erlaubt die runden Klammern und das Plus ohne Maskierung.

Maskierte Quotes vermeidet man durch das Verschachteln von ' mit ". Das funktioniert hier, weil im Sedkommando selbst keine Variable steht, die von der Shell expandiert werden muss. Das wird alles so von Sed interpretiert. Ein Gegenbeispiel wäre:

1
sed 's/"Teilnehmer"/"$USER"/' ...

wo der USER von der Shell ersetzt werden muss, und daher NICHT in Apostrophen stehen darf.

Das -e bei sed kann man sich meist sparen.

Nach "\ SerialNo.*" zu suchen macht keinen Sinn, wenn es nur einen Treffer für SwVersionTerminal gibt und Leerzeichen müssen generell nicht mit Backslash maskiert werden, wenn der Sedbefehl schon als Ganzes maskiert ist:

1
2
3
4
5
6
t530:~/ 🐧> uname -a | sed s/64 GNU/32 WIN/ 
sed: -e Ausdruck #1, Zeichen 4: Nicht beendeter »s«-Befehl
t530:~/ 🐧> uname -a | sed s/64\ GNU/32\ WIN/ 
Linux t530 5.4.0-94-generic #106-Ubuntu SMP Thu Jan 6 23:58:14 UTC 2022 x86_64 x86_64 x86_32 WIN/Linux
t530:~/ 🐧> uname -a | sed "s/64 GNU/32 WIN/"
Linux t530 5.4.0-94-generic #106-Ubuntu SMP Thu Jan 6 23:58:14 UTC 2022 x86_64 x86_64 x86_32 WIN/Linux

Es ist übrigens DER sed (Stream EDitor), nicht DIE (Sozialistische Einheitspartei Deutschlands).

Mit dem vereinfachten Quoting sollte dann dies möglich sein:

1
2
SW=$(sshpass -p $PW ssh $BN@$IP -p 22 -t "sed -nr 's/.*SwVersionTerminal="([0-9.]+)".*/\1/p' /tmp/status.dat")
echo $SW

sonst kannst Du die literalen Anführungsstriche in der status.dat auch durch Dots matchen:

1
2
SW=$(sshpass -p $PW ssh $BN@$IP -p 22 -t "sed -nr 's/.*SwVersionTerminal=.([0-9.]+). .*/\1/p' /tmp/status.dat")
echo $SW

aber Backslashes vor Anführungsstrichen würden wohl auch gehen.

jnpanzer

(Themenstarter)

Anmeldungsdatum:
24. Januar 2022

Beiträge: 19

Danke für den Tipp und die ERklätung "user_unknown" muss mich sed mehr beschäftigen. Die Anführungszeichen sind weg, leider schreibt er aber das tinycore... in die Variable

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
 IP=192.168.178.100
+ PW=password
+ BN=user
+ sshpass -p password ssh -o StrictHostKeyChecking=no user@192.168.178.100 -p 22 -t sed -nr 's/.*SwVersionTerminal=.([0-9.]+). .*/\1/p' /tmp/status.dat
Connection to 192.168.178.100 closed.
+ SW= (▒-
 //\   Core is distributed with ABSOLUTELY NO WARRANTY.
 v_/_           www.tinycorelinux.com

27.22.12
 27.22.12.tinycorelinux.comth ABSOLUTELY NO WARRANTY.
 27.22.12.tinycorelinux.comth ABSOLUTELY NO WARRANTY.

Diese Ausgabe kommt vermutlich vom oder wegen des ssh Login

27.22.12.tinycorelinux.comth ABSOLUTELY NO WARRANTY. 27.22.12.tinycorelinux.comth ABSOLUTELY NO WARRANTY.

anbei das Shell jetzige Script

1
2
3
4
5
6
7
8
9
#/bin/sh
IP="192.168.178.100"
PW="password"
BN="user"
SW=$(sshpass -p $PW ssh -o StrictHostKeyChecking=no $BN@$IP -p 22 -t "sed -nr 's/.*SwVersionTerminal=.([0-9.]+). .*/\1/p' /tmp/status.dat")

echo $SW

#echo -n
Antworten |