Shell脚本调用通过SSH使用STDIN的多个shell脚本

时间:2014-03-21 20:50:00

标签: bash shell ssh nested

所以我有一个使用多个脚本移动和重命名文件的进程。我想要一个运行所有这些脚本的脚本。首先我通过SSH连接到我的服务器然后cd到相应的目录然后运行脚本。看起来像这样。

ssh me@myserver.com<EOF
cd ../../path/to/files/
sh script1.sh
EOF 

此script1.sh然后要求为其运行脚本并在其路径中使用它的目录名称。一旦这个脚本完成,我有另一个我想在同一台服务器上运行的脚本,所以我会修改我的调用脚本看起来像这样。

ssh me@myserver.com<EOF
cd ../../path/to/files/
sh script1.sh
cd ../../diff/directory
sh script2.sh
EOF 

这不起作用...我想在嵌套脚本中使用SSH的STDIN存在问题?希望有人知道一个简单的修复,而不会改变太多。

2 个答案:

答案 0 :(得分:1)

这是你使用ssh:

获取用户输入并在远程shell中回显的方法
ssh -t user@myhost "read -p \"enter val: \" a && echo \"Entered val is: \$a\""

答案 1 :(得分:0)

让我们考虑继续使用here文档方法可以做些什么。

  

此script1.sh然后要求提供目录名称。 ...我想STDIN存在问题

是。看看你的剧本:

ssh me@myserver.com <<EOF
cd ../../path/to/files/
sh script1.sh
cd ../../diff/directory
sh script2.sh
EOF 

script1.sh运行时,其stdin不是来自您的终端;它来自here文件。以下内容证明了这一点:

$ mydir="some/path/" ; ssh home <<EOF
date
read var
$mydir
echo "I got var=\$var"
EOF

这会产生输出:

Fri Mar 21 14:34:03 PDT 2014
I got var=some/path/

发生的事情是read语句要求stdin提供另一行。它得到了here文档的下一行。

如果您希望script1.shstdin上要求提供路径,则需要在here脚本的下一行提供该路径。


附:像这样的复杂化是一个原因,这就是为什么* nix程序员通常更喜欢将参数作为参数放在命令行而不是要求它们作为输入。