Я хочу передать 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 }
}