Írnom kell egy szkriptet, amely Centos 7-es PC-n fut, és csatlakozik egy másik PC-hez Centos 7-el Az ssh használatával hajtson végre egy konzolparancsot, például “ls -la”, és mentse annak kimenetét egy fájlba, hogy később elemezni tudja a kimenetet.
A következő EXPECT parancsfájlt írtam:
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"
Ez a szkript az ssh-n keresztül helyesen csatlakozik az IP = 129.0.0.10-es géphez, és megjeleníti a képernyőn az üzeneteket ami a “put” -on jelenik meg: ls -la végrehajtása ps -af végrehajtása Az ssh munkamenet bezárása
Ez azonban nem mutatja a küldéssel küldött parancsok végrehajtásának eredményét:
ls -la ps -af
Mi a baj ezzel a szkriptel?
Hogyan tudom az előző fájlba mentett parancsok kimenetét elkészíteni, hogy később elemezhessem egy bash-val szkript vagy C program?
Megjegyzések
Válasz
Ehhez nem kell használni a expect
t. A ssh
parancs további argumentumokat is felvehet az SSH-kapcsolaton keresztül futtatni kívánt parancsokból.
1. lépés
Állítson be egy SSH-kulcspárt (google), majd másolja az SSH-t kulcsot a távoli kiszolgálóhoz. Ehhez javasoljuk a ssh-copy-id
használatát. Lásd a válaszomat erre az U & LQ & A címre: Hogyan kell helyesen másolni privát kulcsok a távoli szerverekről a helyi gépemhez, így az ssh használatával csatlakozhatok.
2. lépés
Mostantól lehetőségem van SSH-t használni a kiszolgálóra egy kulcs segítségével , a fenti problémád erre változik:
$ ssh [email protected] "ls -la; ps -af"
Kíváncsi lehetsz, és itt használhatsz dokumentumokat (heredocs aka . here-docs) , hogy tovább fejlessze ezt a technikát.
$ ssh [email protected] <<EOF > ls -la > ps -af > EOF
vagy tegye a parancsokat egy fájlba, és adja át a ssh
:
$ ssh [email protected] < my.cmds
Megjegyzések
- Miért itt a kérdésem unix.stackexchange.com/questions/458801/… másodpéldányként jelölték meg? Úgy gondolom, hogy ' ez más, mivel fel akarok kapni, hogy ne csak a jelszót, hanem a felhasználónevet is megadjam.
Válasz
Köszönöm,
Módosítottam a szkriptet, helyettesítve a sort:
spawn ssh [email protected]
ezzel a másikkal, ahogy mondja nekem:
spawn ssh [email protected] “ls -la; ps -af”
Most látom a képernyőn megjelenő parancsokat és át tudok irányítani egy fájlba.
Ezután megpróbáltam ezt a szkriptet úgy adaptálni, hogy egy másik gépen, amely egy Cisco-szerű kapcsoló, futtasson egy parancsot (ez nem Cisco, de kompatibilis).
Az a parancsfájl, amellyel az ssh használatával csatlakozom a kapcsolóhoz:
** #! / usr / bin / várható -f
120-as időtúllépés beállítása
spawn ssh [email protected] “500-as verzió megjelenítése”
“várakozás” assword: “
” JELSZÓ \ r “küldése
” várakozás ” # “
sleep 5
az” ssh munkamenet bezárása \ r “
send” exit \ r “**
Ez nem működik a kapcsolón, és ezt a hibát kapom:
spawn ssh [email protected] show vlan 501
[email protected] “jelszava:
imish: érvénytelen opció -” c “
További információért próbáld ki az` imish –help szót információk.
send: spawn id exp6 nincs megnyitva
while executing
“send” exit \ r “”
(file "./ssh_script_v3.exp" line 7)
Tehát azt az várakozó szkriptet kell használnom, amely a parancsot a “send” használatával küldi:
! / usr / bin / várható
spawn ssh [email protected]
várható “assword:”
“felhasználó \ r” küldése
várható “>”
alvás 5
“sh vlan 500 \ r” küldése
alvás 5
“kilépés \ r” küldése
Most nem kapok hibát, de semmi sem jelenik meg a képernyőn.
Olvastam, hogy ez azért történik, mert a linuxos és a UNIX rendszerek automatikusan pufferolják a kimenetüket, ha nem interaktív módon futnak. Úgy gondolom, hogy az Expect képes a programokat úgy gondolni, hogy interaktív módon működnek az “unbuffer” segítségével, de nem tudom, hogyan kell használni az “unbuffer” -t a “send” -nel. Attól tartok, hogy ezt megteszem, ne működjön.
spawn ssh [email protected] ls -la>Ls
?expect -d ssh_connection.exp
és nézze meg, hol vannak a problémák. Első dolog, amit ' ajánlok, az összes alvás helyettesítéseexpect "prompt#"