автоматизация сеанса 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 проблемы, с которыми я сталкиваюсь здесь:
-
Как выполнять команды на удаленной системе из скрипта (без участия человека)?
из моего опыта с некоторыми тестами коды, я смог вывести, что когда telnet 10.1.1.1 выполняется, telnet переходит в интерактивный сеанс и последующие строки кода в скрипте выполняются в локальной системе. Как я могу запустить строки кода на удаленной системе, а не на локальной?
Я не могу получить файл журнала для активности в сеансе telnet в локальной системе. Перенаправление stdout, которое я использовал, делает копию на удаленной системе (я не хочу выполните операцию копирования, чтобы скопировать журнал в локальную систему). Как я могу достичь этой функциональности?
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)"
- убедитесь, что в backgroud не работает экран с помощью экран-Общ командой.
- читать http://www.gnu.org/software/screen/manual/screen.html#Stuff читать подробнее о экране и его параметрах.
- '-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**