我想使用 expect 切换到另一个用户,然后以该用户身份运行图形程序。我使用 kcalc 进行测试:
#!/usr/bin/expect
set timeout 20
spawn su dummy
expect "Password:"
send "PASS\r";
send "kcalc\r"
我还尝试删除最后一行并将 su 更改为“su dummy -c kcalc”,但这也不起作用。非常感谢您的帮助。
答案1
为什么不创建一个 sudo 命令来专门执行此操作,并使用 NOPASSWD 选项授予它,而不是将帐户密码留在文件系统中?
答案2
我今天刚刚使用 spawn 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
答案3
这里您有几个选择。
1) 正如 MrTuttle 所说,最好使用 NOPASSWD 将用户添加到 sudoers。这样可以避免需要存储明文 root 密码 /etc/sudoers
yourUser ALL=(OtherUser) NOPASSWD:/path/to/kcalc
将允许你
$ sudo -u OtherUser kcalc
无需输入密码。
2) 您当前的脚本。
当前脚本应该可以正常工作,但请记住,并非每个系统和提示符都将“Password:”大写或在末尾留一个空格。我发现“assword”是更适合测试的字符串。需要注意的另一件事是,su 要求输入 ROOT 密码,而不是用户 dummy。如果您没有 root 密码,则需要以 dummy 身份登录(通常是 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 }
}