Ожидать, что скрипт su будет рутировать и выполнять sed - PullRequest
0 голосов
/ 17 мая 2011

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

  • SSH в машину
  • su для root и введите пароль root
  • собрал файл в / etc / passwd, чтобы заменить некоторый текст другим текстом, для этого примера давайте просто скажем, что исходный текст - TEXT, а текст для замены - NEWTEXT

Может кто-нибудь помочь?

1 Ответ

2 голосов
/ 17 мая 2011

Понятно, что выполнение скрипта для обработки команд с правами 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`"
...