使用shell脚本在远程计算机上运行脚本后终止连接的问题

时间:2011-02-02 19:25:57

标签: shell expect

这是我第一次编写shell脚本。我尽可能多地进行研究以避免愚蠢/重复的问题。请原谅其重复/愚蠢的问题。

我有一个shell脚本连接到远程linux机器并在那里运行脚本。我正在使用'expect'来生成ssh连接并发出命令来触发作业。但是,在完成工作后关闭连接时遇到问题。

这是我的剧本:

set prompt "(%|#|\\$|%\]) $"


    expect -c 'spawn ssh $UN@$STAGE ;
                    expect password ; send "$PASS \n";
                    expect -regexp "$PROMPT"; send "./settings.$UN.sh > settings_log.txt \n";
                    interact'

这个脚本为我成功运行脚本文件($ UN和$ STAGE参数输入到脚本。为简单起见,我在此省略了)。但是,这让我保持开放的联系。 我尝试通过使用以下代替上面的

来运行脚本后关闭连接
expect -c 'spawn ssh   $UN@$STAGE ;
                expect password ; send "$PASS \n";
                expect -regexp "$PROMPT"; send "./settings.$UN.sh > settings_log.txt \n";
                expect -regexp "$PROMPT"; send "exit \n"'

这确实关闭了连接,但我注意到我的脚本文件根本没有运行。此外,根本不会生成settings_log.txt。

这是否意味着,exit命令在完成之前中止进程?我在退出前尝试使用'sleep',但没有帮助。使用expect时是否有更好的建议方法来终止连接? 任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:2)

预计,您终止发送命令时\r而不是\n,所以

 expect -c 'spawn ssh   $UN@$STAGE
            expect password
            send "$PASS\r"
            expect -regexp "$PROMPT"
            send "./settings.$UN.sh > settings_log.txt\r"
            expect -regexp "$PROMPT"
            send "exit\r"
            expect eof'

答案 1 :(得分:1)

请注意,您可以直接使用 ssh scp 执行远程shell命令和复制文件,而无需使用 expect

例如,

scp ./settings.$UN.sh $UN@$STAGE:settings_log.txt
ssh $UN@$STAGE whatever-you-need-to-execute

一旦你需要执行的任何完成,连接就会立即关闭。

答案 2 :(得分:0)

您的外部脚本似乎是用csh编写的,并设置了一个名为“prompt”的变量,但您的expect脚本使用的是一个名为“PROMPT”的变量。尝试使两个变量名匹配大小写。