Понятно, что выполнение скрипта для обработки команд с правами root является серьезной проблемой безопасности и, как правило, недопустимо.
Однако, Ожидайте, что может запускать псевдотерминал, поэтому он может действовать как человек, печатающий на клавиатуре.
Это более или менее то, что вы просили, но не проверено.
#!/bin/sh
# if run from shell, restart with wish \
exec wish "$0" "$@"
package require Expect
proc fix_a_host {host usrname password root_password} {
# open session to host, wait for a username prompt
spawn ssh $host
expect "username:"
# send username, wait for a password prompt
send "$usrname\r"
expect "password:"
# send password, wait for shell prompt
send "$password\r"
expect "%"
# become root, wait for prompt
send "su\r"
expect "#"
# change TEXT to NEWTEXT in password file
send "sed 's/TEXT/NEWTEXT'" /etc/passwd
expect "#"
# exit root, exit host connection
send "exit\r"
expect "%"
send "exit\r"
expect eof
}
fix_a_host {"host1" "someuser" "user_password" "root_password"}
fix_a_host {"host2" "someuser" "user_password" "root_password"}
Если бы это был я, я бы изменил команду sed на что-то гораздо менее разрушительное, например grep TEXT /etc/passwd
, пока не убедился, что она работает хорошо. Для удаленной команды, вывод которой вы хотите видеть, используйте
set results $expect_out(buffer)
send "some_command\r"
expect "#" # use the command prompt to indicate output is complete
puts "command output is got `$buffer`"