【发布时间】:2012-01-13 16:05:04
【问题描述】:
第一次发帖,在此先感谢您的帮助。
总的来说,我对脚本编写有点陌生,但我已经设法在 bash 中构建了一个很好的包装器,旨在收集一些变量,然后与几个远程框建立一些连接,并做一些与网络统计相关的事情系统并启动一些hadoop进程。基本上是我试图自动化的一系列乏味任务。 (不必要的细节已完成)。
我遇到的问题是找到一种方法来有效地连接到那些删除服务器,以普通用户身份进行身份验证,然后切换用户执行各种任务。以下是相关代码:
#!/bin/sh
#Script's run as root. this asks for the sudoers pass
read -p "Enter password for $SUDO_USER: " -s password
#Defines some testing commands I want to pass to a remote box
CMD="hostname; id; sudo su -; id; pwd;"
#launches an expect script with some defined variables as arguments.
/home/ME/scripts/derp.expect $SUDO_USER $definedremoteserver "$command" "$password"
现在使用的期望脚本:
#!/usr/bin/expect
#expect script to help with SSH connections for the urchinizer bash script
set arg1 [lindex $argv 0]
set arg2 [lindex $argv 1]
set arg3 [lindex $argv 2]
set arg4 [lindex $argv 3]
spawn ssh -oStrictHostKeyChecking=no $arg1@$arg2 "$arg3"
expect "password:"
send "$arg4\r"
interact
expect "password"
send "$arg4\r"
interact
我无法确定失败的原因。我已经研究了很多,并尝试了许多代码变体。基本上,当我运行它时,它需要我的通行证并且我能够建立初始连接。然后脚本尝试切换用户,第二个期望失败。第一个 'id' 和 'hostname' 输出成功。当用户切换发生时,第二个期望不起作用,我只剩下一个密码提示。无论如何我输入了我的通行证(由于某种原因以纯文本显示)并且脚本只是挂起而不输出我试图用来验证它是否有效的第二个'id'和'pwd'命令。
如果我真的登录到该框并执行 sudo -i 或 sudo su - 这就是密码提示的样子:
[sudo] password for my.name:
所以对于第二个(不工作的)期望,我尝试了一些不同的变体,结果有些不同,但没有成功。
抱歉,帖子太长了。这一直让人发疯。我正在尝试做的事情可能吗?有没有更聪明的方法来处理这个问题?有人发现任何明显的错误吗?另外,第二个问题......通配符如何在那些期望行中工作?
【问题讨论】:
-
当您标记这个 bash 时,我假设是 Linux/Unix,而不是寡妇。您是否尝试在期望脚本中将 '\r' 替换为 '\n' ?这对于linux来说会更标准。您确定您的 remote sudoers 文件、用户权限等设置正确吗?祝你好运。