автоматизация сеанса telnet с помощью скриптов bash


Я работаю над автоматизацией некоторых задач, связанных с 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.

есть 2 проблемы, с которыми я сталкиваюсь здесь:

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

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

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

10 63

10 ответов:

написать 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 two you (Nice expect feature!)
interact

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

telnet 10.1.1.1 <<EOF
remotecommand 1
remotecommand 2
EOF

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

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

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

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-документ.

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

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

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

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

вы можете использовать сценарии ожидания instaed из bash. Ниже пример показывает, как telnex во встроенную плату, не имеющую пароля

#!/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

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

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

#!/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"

вот как использовать telnet в оболочке bash / 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 "'^]'."

ниже работает для меня... поместите все ваши 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

сыграет с 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**