使用 Expect 进行 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”,但这也不起作用。非常感谢您的帮助。

答案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 }
}    

相关内容