Musím napsat skript, který běží na PC s Centos 7 a připojuje se k jinému PC s Centos 7 pomocí ssh proveďte příkaz konzoly, například „ls -la“ a uložte jeho výstup do souboru, abyste mohli tento výstup později analyzovat.

Napsal jsem následující skript EXPECT:

ssh_connection.exp:

#!/usr/bin/expect -f set timeout 120 spawn ssh [email protected] expect "assword:" send "PASSWORD\r" expect "prompt#" sleep 5 puts "Executing ls -la" send "ls -la\r" sleep 10 puts "Executing ps -af" puts "ps -af\r" sleep 10 puts "Closing the ssh session\r" send "exit\r" 

Tento skript se správně připojuje přes ssh ke stroji s IP = 129.0.0.10 a zobrazuje na obrazovce zprávy , který se objeví na „putech“: Provádění ls -la Provádění ps -af Ukončení relace ssh

Nezobrazuje však výsledek provádění příkazů, které posílám pomocí send:

ls -la ps -af 

Co je s tímto skriptem?

Jak mohu provést výstup předchozích příkazů uložených v souboru, abych jej mohl později analyzovat pomocí bash skript nebo program C?

Komentáře

  • Stačí použít sta Příkaz ndard ssh s klávesami ssh a heredoc
  • Zdá se, že věci příliš komplikujete. Nemusíte používat automatizaci pomocí ssh.
  • zkusili jste příkaz jako spawn ssh [email protected] ls -la>Ls?
  • Spustit skript pomocí expect -d ssh_connection.exp a podívejte se, kde jsou problémy. První věc, kterou ' doporučuji, je nahradit všechny režimy spánku expect "prompt#"

Odpověď

K tomu nemusíte používat expect. ssh může přijmout další argumenty příkazů, které chcete spustit prostřednictvím připojení SSH.

Krok 1

Nastavte pár klíčů SSH (vyhledejte jej v google) a poté zkopírujte SSH klíč ke vzdálenému serveru. Doporučuji použít ssh-copy-id. Viz moje odpověď na tuto U & LQ & Název: Jak správně kopírovat soukromé klíče ze vzdálených serverů k mému místnímu stroji, abych se mohl připojit pomocí ssh .

Krok č. 2

Nyní se schopností SSH k serveru na místě pomocí klíče , váš výše uvedený problém se změní na toto:

$ ssh [email protected] "ls -la; ps -af" 

Můžete si vytvořit fantazii a použít zde dokumenty (heredocs aka . here-docs) k dalšímu zdokonalení této techniky.

$ ssh [email protected] <<EOF > ls -la > ps -af > EOF 

nebo vložte příkazy do souboru a předejte je ssh:

$ ssh [email protected] < my.cmds 

Komentáře

Odpovědět

Díky,

Upravil jsem svůj skript nahrazující řádek:

spawn ssh [email protected]

s tímto druhým, jak mi říkáte:

spawn ssh [email protected] „ls -la; ps -af“

Nyní vidím výstup příkazů na obrazovce a můžu přesměrovat na soubor.

Dále jsem se pokusil upravit tento skript tak, aby provedl příkaz na jiném stroji, který je přepínačem typu Cisco (není to Cisco, ale je kompatibilní).

Skript, kterým se připojuji k přepínači pomocí ssh, je:

** #! / usr / bin / expect -f

nastavit časový limit 120

založit ssh už[email protected] „zobrazit vlan 500“

očekávat „assword:“

odeslat výzvu „HESLO \ r“

očekávat “ # „

spánek 5

umístí“ Ukončení relace ssh \ r „

odeslat“ exit \ r „**

Na přepínači to nefunguje a zobrazí se tato chyba:

zobrazit ssh [email protected] show vlan 501

heslo už[email protected]:

imish: neplatná volba – „c“

Zkuste `imish –help“ pro více informace.

send: spawn id exp6 not open

while executing 

„send“ exit \ r „“

(file "./ssh_script_v3.exp" line 7) 

Takže musím použít skript expect, který příkaz odešle pomocí příkazu „send“:

! / usr / bin / expect

založit ssh už[email protected]

očekávat „assword:“

odeslat „user \ r“

očekávat „>“

spánek 5

odeslat „sh vlan 500 \ r“

spánek 5

odeslat „ukončit \ r“

Nyní se mi nezobrazí žádná chyba, ale na obrazovce se nic nedělá.

Četl jsem, že toto Stává se to proto, že linuxové a unixové systémy automaticky načítají do vyrovnávací paměti svůj výstup, když běží neinteraktivně. Myslím, že program Expect může přimět programy, aby si myslely, že běží interaktivně, pomocí „unbufferu“, ale nevím, jak používat „unbuffer“ s „send“. Moje pokusy to udělat, nefungují.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *