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
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
- Proč moje otázka zde unix.stackexchange.com/questions/458801/… byl označen jako duplikát? Věřím, že ' se liší, protože chci být povýšen na zadání uživatelského jména, nejen hesla.
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í.
spawn ssh [email protected] ls -la>Ls
?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ánkuexpect "prompt#"