SU和使用期望的运行命令

我想用另一个用户,使用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 } }