我想用另一个用户,使用expect,然后以该用户身份运行一个graphics程序。 我正在使用kcalc来testing:
#!/usr/bin/expect set timeout 20 spawn su dummy expect "Password:" send "PASS\r"; send "kcalc\r"
我也尝试删除最后一行,并将su改为“su dummy -c kcalc”,但这也不起作用。 我感谢任何帮助。
为什么不直接创build一个sudo命令来执行这个操作,而是使用NOPASSWD选项授予它呢?
我今天正在做这个使用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
这里有几个选项。
1)正如MrTuttle所说,用NOPASSWD将你的用户joinsudoers是有好处的。 这将防止需要存储明文根密码/ etc / sudoers
yourUser ALL=(OtherUser) NOPASSWD:/path/to/kcalc
将允许你
$ sudo -u OtherUser kcalc
没有被提示input密码。
2)你当前的脚本。
请记住您当前的脚本,请记住,不是每个系统和提示都会大写“密码:”或留下空格。 我发现“密码”是一个更好的string来testing。 另外要注意的是,su是要求ROOT密码,而不是用户虚拟。 如果你没有root密码,你需要login为dummy(通常是ssh -l dummy localhost)
对于一些debugging步骤,您可以在期望的密码阶段尝试多个语句。 我发现在开发脚本时testing和报告timeout和eof是很有用的。
你可能想试试看看你的脚本在哪里结束
expect { -re "(.*)assword:" { sleep 1; send -- "password\r" } timeout { puts "un-able to login: timeout\n"; return } eof { puts "Closed\n" ; return } }