2011-02-02 40 views
2

这是我第一次编写shell脚本。为了避免愚蠢/重复的问题,我尝试尽可能多地进行研究。请原谅,如果它的重复/愚蠢的问题。使用shell脚本在远程计算机上运行脚本后终止连接的问题

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

这是我的脚本:

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


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

该脚本运行成功对我来说,脚本文件($联合国和$ STAGE参数输入到剧本我省略了这里简单)。但是,这给我留下了一个开放的连接。 我试图通过使用脚本运行后关闭连接以下,而不是上面

expect -c 'spawn ssh [email protected]$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根本不会生成。

这是否意味着退出命令在完成之前中止了进程?我尝试在退出前使用“睡眠”,但没有帮助。使用expect期间是否有更好的建议方式来终止连接? 任何帮助表示赞赏。

+0

你能向我解释什么期望* -regexp“$提示符” *呢?我不熟悉* expect *。 – user359996 2011-02-02 19:52:14

+0

这是第一次与预期。 expect -regexp“$ PROMPT”等待shell完成其工作,并返回用户输入。例如 我开始使用ssh连接。 expect -c'spawn ssh $ UN @ $ STAGE; 现在,我知道ssh会要求输入密码。由于我知道这一点,所以我可以告诉我的脚本为它做好准备并在发生这种情况时发送密码。这是通过以下语句实现的。 期待密码;发送“$ PASS \ n” 您也可以给正则表达式expect.That是我试图做的。我在顶部定义了一个变量($ PROMPT)并在下一个语句中使用它 – PraveenGorthy 2011-02-02 22:54:50

回答

2

与期望的那样,您终止与发送不\r命令\n,所以

expect -c 'spawn ssh [email protected]$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

注意您可以执行远程shell命令,并使用SSH SCP ,直接,不使用预计复制文件。

例如,

scp ./settings.$UN.sh [email protected]$STAGE:settings_log.txt 
ssh [email protected]$STAGE whatever-you-need-to-execute 

连接将关闭尽快尽快任何你需要对执行完成。

+0

我试过这样做。但是ssh $ UN @ $ STAGE要我输入密码。我需要这个脚本,而无需用户干预。比方说,如果我可以为用户创建HTML表单,然后他进入他的联合国和PWD,我希望我的系统启动这个脚本。我无法做到这一点ssh提示我为PWD。所以,我正在使用除外。 – PraveenGorthy 2011-02-02 22:42:26

+0

您可以使用证书标识自己,使用* expect *将密码提供给* ssh *,或者使用* sshpass *为您完成。请注意,第一个选项是迄今为止最安全的选项,也适用于* scp *(与第二个选项一样,但安全性较低)。 – user359996 2011-02-02 23:06:21

0

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

相关问题