Aiuto a creare uno script per il comando Telnet

22 risposte [Ultimo contenuto]
Ritratto di Jacobbe73
Jacobbe73
(Geek)
Offline
Geek
Iscritto: 19/04/2013
Messaggi: 65

Ciao a tutti,
scrivo questo post perché vorrei sul mio pc (Debian 7.0) creare uno script Bash in modo da inviare comandi a un dispositivo linux tramite telnet automaticamente ad una frequenza prestabilita ogni giorno).
Il mio primo ostacolo è il seguente:
Come faccio a far si che il comando telnet faccia il login automatico?
Io avrei bisogno che il mio file .sh facesse le seguenti operazioni:
1) telnet 192.168.1.133
2) inserisse l'utente "root"
3) inserisse la password "123456"
4) eseguisse a sua volta un comando .sh
5) facesse l'exit dal telnet

Spero di esser stato chiaro e ringrazio in anticipo per qualsiasi utile informazione!
saluti a tutti
Jacobbe73

Ritratto di badroot
badroot
(Guru)
Offline
Guru
Iscritto: 22/08/2008
Messaggi: 2068

Telnet ? sul serio ?
Ma non puoi installare un server SSH che ci guadagni sia in sicurezza che in praticità.
Comunque prova a vedere qui.

Ritratto di Jacobbe73
Jacobbe73
(Geek)
Offline
Geek
Iscritto: 19/04/2013
Messaggi: 65

@ Badroot, grazie per la tempestiva risposta Applause
Ho impostato lo script in questo modo, lo eseguo e si chiude subito la finestra ma secondo me non funziona:

#!/usr/bin/expect #Where the script should be run from.

#If it all goes pear shaped the script will timeout after 20 seconds.
set timeout 20
#First argument is assigned to the variable name
set name [lindex $argv 0]
#Second argument is assigned to the variable user
set user [lindex $argv 1]
#Third argument is assigned to the variable password
set password [lindex $argv 2]
#This spawns the telnet program and connects it to the variable name
spawn telnet $192.168.1.133
#The script expects login
expect "login:"
#The script sends the user variable
send "$root "
#The script expects Password
expect "Password:"
#The script sends the password variable
send "$123456 "
#This hands control of the keyboard over two you (Nice expect feature!)
interact

Cosa sbaglio? l'ho interpretato bene lo script?
grazie
Jacobbe73

Ritratto di badroot
badroot
(Guru)
Offline
Guru
Iscritto: 22/08/2008
Messaggi: 2068

#!/usr/bin/expect 
#Where the script should be run from.
 
#If it all goes pear shaped the script will timeout after 20 seconds.
set timeout 20
#First argument is assigned to the variable name
#set name [lindex $argv 0]
#Second argument is assigned to the variable user
#set user [lindex $argv 1]
#Third argument is assigned to the variable password
#set password [lindex $argv 2]
#This spawns the telnet program and connects it to the variable name
spawn telnet 192.168.1.133
#The script expects login
expect "login:"
#The script sends the user variable
send root\r
#The script expects Password
expect "Password:"
#The script sends the password variable
send 123456\r
#This hands control of the keyboard over two you (Nice expect feature!)
interact 

Per prima cosa usa i tag code per rendere meglio leggibile il codice.
Se opti per mettere fissi i valori IP, utente e password nello script non devi preporre il carattere $, e non ti servono nemmeno le istruzioni set name/user/password. Le ho commentate infatti.

Ora se esegui lo script, lo avrai già reso eseguibile e avrai anche installato l'interprete tcl-expect.

./mioscript

che output ti riporta ?

spawn telnet 192.168.1.133
Trying 192.168.1.133...
telnet: Unable to connect to remote host: No route to host
send: spawn id exp4 not open
    while executing
"send root"
    (file "./mioscript" line 17)

ovviamente a me da errore perchè non trova nessun host con quell'IP .... ma da te dovrebbe comportarsi diversamente.
Purtroppo vado solo a naso in quanto non posso testare realmente lo script in quanto non ho nessun server telnet disponibile.

Ritratto di badroot
badroot
(Guru)
Offline
Guru
Iscritto: 22/08/2008
Messaggi: 2068

Ciao,
ho potuto fare un test reale verso una macchina SCO Unix dove telnet è attivo, questo è lo script di esempio che si limita ad eseguire il comando uname e restare in attesa 5 secondi prima di chiudere la connessione.

#!/usr/bin/expect 
 
set timeout 20
spawn telnet 192.168.1.50
expect "login:"
send root\r
expect "Password:"
send root\r
send \r
send "uname -X\r"
send "sleep 5\r"
send exit\r
interact

certo non è il più educativo degli esempi ma credo che ti sarà semplice adattarlo poi alle tue necessità con i comandi che ti serve eseguire in remoto.

Ritratto di Jacobbe73
Jacobbe73
(Geek)
Offline
Geek
Iscritto: 19/04/2013
Messaggi: 65

Badroot,
grazie per i tuoi preziosi consigli, sono fuori per lavoro e non riuscirò a verificare quanto suggerito da te prima di questo fine settimana!
Ovviamente riferirò l'esito!
grazie ancora, saluti
Jacobbe73

Ritratto di Jacobbe73
Jacobbe73
(Geek)
Offline
Geek
Iscritto: 19/04/2013
Messaggi: 65

Ciao Badroot,
ho finalmente fatto le prove ma purtroppo c'è ancora qualcosa che non và....

Dunque, seguendo i tuoi suggerimenti ho fatto questo script:

#!/usr/bin/expect

set timeout 20
spawn telnet 192.168.1.133
expect "vusolo2 login:"
send root\r
expect "Password:"
send 123456\r
send \r
send "uname -X\r"
send "sleep 5\r"
send "reboot"
send exit\r
interact

Eseguo il mio script (file di nome script.sh) con ovviamente spuntato, nelle proprietà del file, la caratteristica "Consentire l'esecuzione del file come programma", ma purtroppo nulla accade.
Premetto che la macchina alla quale cerco di collegarmi (con ip 192.168.1.133) è un ricevitore satellitare Linux based e come potrai ben notare, per rendermi conto del funzionamento di questo script come comando ho messo il classico "reboot". Purtroppo questo non avviene e non capisco se comunque lo script riesce a loggarsi oppure nemmeno quello.
Ho modificato una cosa sulla riga "expect". vusolo2 (nome del ricevitore) e non root (come da tuo esempio) perché è così che vedo il log facendo il telnet in manuale. Ovviamente prima avevo lasciato root ma non funzionava.
Come faccio a sapere se lo script riesce a loggarsi oppure nemmeno l'inserimento del nome utente riesce ad inserire?
saluti e grazie per il prezioso supporto!
Jacobbe73

Ritratto di badroot
badroot
(Guru)
Offline
Guru
Iscritto: 22/08/2008
Messaggi: 2068

Ciao,
quando si vogliono testare degli script è sempre buona idea fare le prove da terminale e non usando le funzionalità del file manager o del DE.
Quindi apri un terminale ed da qui esegui il comando :

./script.sh

ovviamente posizionati nella cartella dove hai salvato lo script.
Un paio di cose.
Usa il tag code per listare i comandi o gli script
Nello script la seguente riga usa un'opzione specifica di SCO quindi darà errore.

send "uname -X\r"

Nell'invio del comando reboot manca il suffisso \r, deve essere così :

send reboot\r
send exit\r

Ovviamente devi prima di tutto avere l'interprete installato.

sudo apt-get install expect

In ogni caso da terminale vedi esattamente cosa succede e quindi puoi capire dove sta l'errore.

Ritratto di Jacobbe73
Jacobbe73
(Geek)
Offline
Geek
Iscritto: 19/04/2013
Messaggi: 65

Grazie 1000 Badroot, Funziona!!!!!
ho installato expect come da te suggerito e provato lo script ./script.sh da terminale!
grazie ancora, salutoni!
Jacobbe73

Ritratto di Jacobbe73
Jacobbe73
(Geek)
Offline
Geek
Iscritto: 19/04/2013
Messaggi: 65

Ingolosito dallo script, mi sto cimentando a fare la stessa cosa per avviare in automatico la connessione con un client openvpn, infatti ho modificato lo script in questo modo:

#!/usr/bin/expect

set timeout 20
spawn /usr/sbin/openvpn --config /etc/openvpn/Ceghino.conf
expect "Initialization Sequence Completed"
interact

Però non funziona, cosa potrei aver sbagliato questa volta?
L'openvpn è installato.
Confused

Ritratto di badroot
badroot
(Guru)
Offline
Guru
Iscritto: 22/08/2008
Messaggi: 2068

A parte che non ho capito cosa tu voglia fare, l'esecuzione del comando openvpn non è interattiva .... o sbaglio ?
In ogni caso per come è impostato lo script tu gli stai dicendo di eseguire il comando openvpn, aspettare che ti venga restituita la stringa specificata e poi andare in modalità interattiva e visto che openvpn non ha una sua shell immagino che lo script termini ritornando alla shell del tuo terminale.
Ma mi pare anche abbastanza ovvio che si comporti così.
Purtroppo non ho la possibilità di simulare una connessione con openvpn, ma come dico non capisco nemmeno lo scopo o l'utilità di uno script simile.