所以我有一个使用多个脚本移动和重命名文件的进程。我想要一个运行所有这些脚本的脚本。首先我通过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存在问题?希望有人知道一个简单的修复,而不会改变太多。
答案 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.sh
在stdin
上要求提供路径,则需要在here
脚本的下一行提供该路径。
附:像这样的复杂化是一个原因,这就是为什么* nix程序员通常更喜欢将参数作为参数放在命令行而不是要求它们作为输入。