Í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

  • Csak használjon stat ndard ssh parancs ssh kulcsokkal és heredoc
  • Úgy tűnik, túl bonyolítja a dolgokat. Nem kell az várakozást használnia a dolgok automatizálásához az ssh-n keresztül.
  • Kipróbált egy olyan parancsot, mint például: spawn ssh [email protected] ls -la>Ls?
  • Futtassa a szkriptet 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ése expect "prompt#"

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.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük