wake-up-neo.com

telnet-Sitzung mit Bash-Skripten automatisieren

Ich arbeite daran, einige Telnet-bezogene Aufgaben zu automatisieren, indem ich Bash-Skripte benutze. Nach der Automatisierung erfolgt keine Interaktion des Benutzers mit Telnet. (das ist es wird völlig automatisiert sein)

die Skripte sehen ungefähr so ​​aus:

# execute some commands on the local system
# access a remote system with an IP address: 10.1.1.1 (for example)

telnet 10.1.1.1

# execute some commands on the remote system
# log all the activity (in a file) on the Local system
# exit telnet
# continue on with executing the rest of the script.

Ich habe hier zwei Probleme:

  1. Wie führt man die Befehle auf dem Remote-System aus dem Skript aus (ohne menschliche Interaktion)? 

    Aus meiner Erfahrung mit einigen Testcodes konnte ich ableiten, dass Telnet bei Ausführung von telnet 10.1.1.1 in eine interaktive Sitzung geht und die nachfolgenden Codezeilen im Skript auf dem lokalen System ausgeführt werden. Wie kann ich die Codezeilen auf dem fernen System und nicht auf dem lokalen ausführen?

  2. In der Telnet-Sitzung auf dem lokalen System kann keine Protokolldatei für die Aktivität abgerufen werden. Die von mir verwendete stdout-Weiterleitung erstellt eine Kopie auf dem fernen System (ich möchte keinen Kopiervorgang ausführen, um das Protokoll auf das lokale System zu kopieren). Wie kann ich diese Funktionalität erreichen?

70
khan

Schreibe ein expect script.

Hier ist ein Beispiel:

#!/usr/bin/expect

#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 $name 
#The script expects login
expect "login:" 
#The script sends the user variable
send "$user "
#The script expects Password
expect "Password:"
#The script sends the password variable
send "$password "
#This hands control of the keyboard over two you (Nice expect feature!)
interact
67
joemooney

Ich würde auch empfehlen, zu erwarten, dass die normalen Shell-Befehle für die nicht-interaktive Verwendung ausreichen. Telnet akzeptiert seinen Befehl auf stdin. Sie müssen also nur die Befehle hineinpfeifen oder schreiben:

telnet 10.1.1.1 <<EOF
remotecommand 1
remotecommand 2
EOF

(Bearbeiten: Den Kommentaren nach zu urteilen, der Remote-Befehl benötigt etwas Zeit, um die Eingaben zu verarbeiten, oder das frühe SIGHUP wird vom Telnet nicht ordnungsgemäß übernommen. In diesen Fällen versuchen Sie möglicherweise, die Eingabe kurz in den Ruhezustand zu bringen :)

{ echo "remotecommand 1"; echo "remotecommand 2"; sleep 1; } | telnet 10.1.1.1

In jedem Fall verwenden Sie expect, wenn Sie interaktiv werden oder etwas anderes.

73
thiton

Telnet wird häufig verwendet, wenn Sie das HTTP-Protokoll lernen. Ich habe dieses Skript früher als Teil meines Web-Scrapers verwendet:

echo "open www.example.com 80" 
sleep 2 
echo "GET /index.html HTTP/1.1" 
echo "Host: www.example.com" 
echo 
echo 
sleep 2

sagen wir, der Name des Skripts lautet dann get-page.sh:

get-page.sh | telnet

gibt Ihnen ein HTML-Dokument.

Hoffe es wird jemandem helfen;)

40
biera

Das hat für mich funktioniert .. 

Ich habe versucht, mehrere Telnet-Anmeldungen zu automatisieren, für die ein Benutzername und ein Kennwort erforderlich sind. Die Telnet-Sitzung muss unbegrenzt im Hintergrund ausgeführt werden, da ich Protokolle von verschiedenen Servern auf meinem Computer speichere.

telnet.sh automatisiert die Anmeldung mit dem Befehl 'Expect'. Weitere Informationen finden Sie hier: http://osix.net/modules/article/?id=30

telnet.sh

#!/usr/bin/expect
set timeout 20
set hostName [lindex $argv 0]
set userName [lindex $argv 1]
set password [lindex $argv 2]

spawn telnet $hostName

expect "User Access Verification"
expect "Username:"
send "$userName\r"
expect "Password:"
send "$password\r";
interact

sample_script.sh dient zum Erstellen eines Hintergrundprozesses für jede Telnet-Sitzung durch Ausführen von telnet.sh. Weitere Informationen finden Sie im Kommentarbereich des Codes.

sample_script.sh

#!/bin/bash
#start screen in detached mode with session-name 'default_session' 
screen -dmS default_session -t screen_name 
#save the generated logs in a log file 'abc.log' 
screen -S default_session -p screen_name -X stuff "script -f /tmp/abc.log $(printf \\r)"
#start the telnet session and generate logs
screen -S default_session -p screen_name -X stuff "expect telnet.sh hostname username password $(printf \\r)"
  1. Stellen Sie sicher, dass im Hintergrund kein Bildschirm ausgeführt wird, indem Sie den -Befehl 'screen -ls' verwenden. 
  2. Read http://www.gnu.org/software/screen/manual/screen.html#Stuff um Zu lesen, um mehr über den Bildschirm und seine Optionen zu erfahren. 
  3. Die Option "-p" in sample_script.sh wählt ein bestimmtes Fenster aus und fügt es erneut hinzu, um einen Befehl über die Option "__ -X" zu senden. Andernfalls wird die Fehlermeldung "Keine Bildschirmsitzung gefunden" angezeigt.
9
Nikhil

Folgendes funktioniert für mich ... Füge alle deine IPs, die du telnet, in IP_sheet.txt ein

while true
read a
do
{
    sleep 3
    echo df -kh
    sleep 3
    echo exit
} | telnet $a
done<IP_sheet.txt
2

Sie können Expect-Skripte anstelle von bash ..__ verwenden. Das folgende Beispiel zeigt, wie Sie in ein Embedded Board ohne Kennwort telnexpt

#!/usr/bin/expect

set ip "<ip>"

spawn "/bin/bash"
send "telnet $ip\r"
expect "'^]'."
send "\r"
expect "#"
sleep 2

send "ls\r"
expect "#"

sleep 2
send -- "^]\r"
expect "telnet>"
send  "quit\r"
expect eof
2
A R

Verwenden Sie dazu ssh. Generieren Sie Schlüssel, ohne ein Kennwort zu verwenden, und legen Sie es auf dem Remote-Computer unter .authorized_keys ab. Erstellen Sie das Skript für die Remote-Ausführung, kopieren Sie es auf die andere Maschine und führen Sie es einfach mit ssh aus der Ferne aus.

Ich habe diesen Ansatz oft mit großem Erfolg angewandt. Beachten Sie auch, dass es viel sicherer ist als Telnet.

1
TMS

So verwenden Sie Telnet in der bash Shell/Expect 

#!/usr/bin/expect
# just do a chmod 755 one the script
# ./YOUR_SCRIPT_NAME.sh $YOUHOST $PORT
# if you get "Escape character is '^]'" as the output it means got connected otherwise it has failed

set ip [lindex $argv 0]
set port [lindex $argv 1]

set timeout 5
spawn telnet $ip $port
expect "'^]'."
0
grepit
#!/bin/bash
ping_count="4"
avg_max_limit="1500"
router="sagemcom-fast-2804-v2"
adress="192.168.1.1"
user="admin"
pass="admin"

VAR=$(
expect -c " 
        set timeout 3
        spawn telnet "$adress"
        expect \"Login:\" 
        send \"$user\n\"
        expect \"Password:\"
        send \"$pass\n\"
        expect \"commands.\"
        send \"ping ya.ru -c $ping_count\n\"
        set timeout 9
        expect \"transmitted\"
        send \"exit\"
        ")

count_ping=$(echo "$VAR" | grep packets | cut -c 1)
avg_ms=$(echo "$VAR" | grep round-trip | cut -d '/' -f 4 | cut -d '.' -f 1)

echo "1_____ping___$count_ping|||____$avg_ms"
echo "$VAR"
0
shaman888