автоматизация сессии telnet с использованием скриптов bash - PullRequest
73 голосов
/ 10 августа 2011

Я работаю над автоматизацией некоторых задач, связанных с telnet, используя скрипты Bash. После автоматизации не будет никакого взаимодействия пользователя с telnet. (то есть это будет полностью автоматизировано)

сценарии выглядят примерно так:

# 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.

Здесь я сталкиваюсь с двумя проблемами:

  1. Как выполнить команды на удаленной системе из сценария (без участия человека)?

    Из моего опыта работы с некоторыми тестовыми кодами я смог сделать вывод, что при выполнении telnet 10.1.1.1 telnet переходит в интерактивный сеанс, а последующие строки кода в сценарии выполняются в локальная система. Как я могу запустить строки кода на удаленной системе, а не на локальной?

  2. Я не могу получить файл журнала для активности в сеансе telnet в локальной системе. Перенаправление stdout, которое я использовал, делает копию в удаленной системе (я не хочу выполнять операцию копирования, чтобы скопировать журнал в локальную систему). Как я могу достичь этой функциональности?

Ответы [ 10 ]

75 голосов
/ 11 августа 2011

Несмотря на то, что я бы рекомендовал использовать и ожидать, для неинтерактивного использования вполне подойдут обычные команды оболочки.Telnet принимает свою команду на stdin, поэтому вам просто нужно передать или записать в нее команды:

telnet 10.1.1.1 <<EOF
remotecommand 1
remotecommand 2
EOF

(Правка: Судя по комментариям, удаленной команде требуется некоторое время для обработки ввода или раннегоSIGHUP не воспринимается изящно телнетом. В этих случаях вы можете попробовать короткий сон на входе:)

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

В любом случае, если он становится интерактивным или что-то еще, используйте expect.

72 голосов
/ 10 августа 2011

Напишите скрипт expect.

Вот пример:

#!/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 to you (Nice expect feature!)
interact

Для запуска:

./myscript.expect name user password
41 голосов
/ 30 августа 2012

Telnet часто используется, когда вы изучаете протокол HTTP.Я использовал этот сценарий как часть моего веб-скребка:

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

скажем, имя сценария get-page.sh, тогда:

get-page.sh | telnet

дастВы HTML-документ.

Надеюсь, это будет кому-то полезно;)

10 голосов
/ 15 января 2014

Это сработало для меня ..

Я пытался автоматизировать несколько входов в telnet, которые требуют имя пользователя и пароль.Сеанс telnet должен выполняться в фоновом режиме неограниченное время, так как я сохраняю журналы с разных серверов на моей машине.

telnet.sh автоматизирует вход в telnet с помощью команды «ожидается».Дополнительную информацию можно найти здесь: 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 используется для создания фонового процесса для каждого сеанса telnetзапустив telnet.sh.Дополнительную информацию можно найти в разделе комментариев кода.

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. Убедитесь, что в фоновом режиме не работает экраниспользуя команду 'screen -ls'.
  2. Прочитайте http://www.gnu.org/software/screen/manual/screen.html#Stuff, чтобы узнать больше об экране и его параметрах.Параметр
  3. '- p' в sample_script.sh предварительно выбирает и повторно подключает к конкретному окну для отправки команды с помощью параметра '-X', в противном случае вы получите ошибку 'Не найден сеанс экрана'.
2 голосов
/ 31 января 2018

Следующее работает для меня ... введите все свои IP-адреса, которые вы хотите telnet в IP_sheet.txt

while true
read a
do
{
    sleep 3
    echo df -kh
    sleep 3
    echo exit
} | telnet $a
done<IP_sheet.txt
2 голосов
/ 31 июля 2013

Вы можете использовать ожидаемые сценарии вместо bash. Ниже приведен пример, как подключиться к встроенной плате без пароля

#!/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
1 голос
/ 19 июля 2017
#!/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"
1 голос
/ 10 августа 2011

Используйте ssh для этой цели.Генерируйте ключи без использования пароля и поместите его в .authorized_keys на удаленном компьютере.Создайте сценарий для удаленного запуска, скопируйте его на другой компьютер и затем просто запустите его удаленно, используя ssh.

Я использовал этот подход много раз с большим успехом.Также обратите внимание, что он намного безопаснее, чем telnet.

0 голосов
/ 15 ноября 2017

Вот как использовать telnet в оболочке bash / ожидайте

#!/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 голосов
/ 07 марта 2012

Поиграйте с tcpdump или wireshark и посмотрите, какие команды отправляются на сам сервер

Попробуйте это

printf (printf "$username\r\n$password\r\nwhoami\r\nexit\r\n") | ncat $target 23

Некоторые серверы требуют задержки с паролем, как это происходитне удерживать строки в стеке

printf (printf "$username\r\n";sleep 1;printf "$password\r\nwhoami\r\nexit\r\n") | ncat $target 23**
...