这是我第一次编写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时是否有更好的建议方法来终止连接? 任何帮助表示赞赏。
答案 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”的变量。尝试使两个变量名匹配大小写。