Назад | Перейти на главную страницу

SU и выполнить команду с помощью Expect

Я хочу передать su другому пользователю с помощью expect, а затем запустить графическую программу от имени этого пользователя. Я использую kcalc для тестирования:

#!/usr/bin/expect
set timeout 20
spawn su dummy
expect "Password:"
send "PASS\r";
send "kcalc\r"

Я также попытался удалить последнюю строку и изменить su на su dummy -c kcalc, но это тоже не сработало. Я ценю любую помощь.

Вместо того, чтобы оставлять пароли учетных записей в файловой системе, почему бы просто не создать команду sudo специально для этого и предоставить ей параметр NOPASSWD?

Я просто делал это сегодня, используя сеансы порождения SSH, вот несколько фрагментов кода, которые я написал, не уверен, поможет ли это:

echo "Type the account you wish to use to issue the command, followed by [ENTER]: "
read account
read -s -p "Password: " password
echo "Type the command you wish to execute, followed by [ENTER]: "
read command
echo "Type the hostname you want to connect to, followed by [ENTER]: "
read hostname
switchToSudo="sudo su"
shortenedHost=`echo $hostname|cut -d. -f 1`
accountSwitched="root@$shortenedHost:/home/$account#"


 VAR=$(expect -c "
        expect \"*~$\"
        send \"$switchToSudo\r\"
        expect \"*?assword*\"
        send \"$password\r\"
        spawn ssh $account@$hostname
        expect "*?assword:*"
        send \"$password\r\"
        expect \"*~$\"
        send \"$switchToSudo\r\"
        expect ""
        send \"$command\r\n\"
        send "logoff"
        ")
echo "=============="
echo "$VAR"
exit

У вас есть несколько вариантов.

1) Как заявил MrTuttle, добавление вашего пользователя в sudoers с NOPASSWD является предпочтительным. Это избавит от необходимости хранить пароль root в открытом виде / etc / sudoers

yourUser ALL=(OtherUser) NOPASSWD:/path/to/kcalc 

позволит вам

$ sudo -u OtherUser kcalc

без запроса пароля.

2) Ваш текущий сценарий.

Ваш текущий сценарий должен работать, имейте в виду, что не все системные и подсказки пишутся с заглавной буквы «Пароль:» или оставляют пробел в конце. Я считаю, что "assword" - лучшая строка для тестирования. Еще следует отметить, что su запрашивает пароль ROOT, а не фиктивный пользовательский пароль. Если у вас нет пароля root, вам нужно будет вместо этого войти как фиктивный (обычно ssh -l dummy localhost)

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

Вы можете попробовать это, чтобы увидеть, где заканчивается ваш сценарий

expect {
  -re "(.*)assword:"  { sleep 1; send -- "password\r" }
  timeout     { puts "un-able to login: timeout\n"; return }
  eof         { puts "Closed\n" ; return }
}