我本质上想在机器 A 上运行一个脚本,该脚本将通过 SSH 连接到机器 B,在 B 上执行命令,并将输出返回到机器 A。
因此,如果可能的话,我希望创建一个 csh 脚本来执行此操作。
例如,这个解决方案来自这个答案从命令行工作:
ssh user@host << 'ENDSSH'
ls -l
ENDSSH
我可以验证它是在远程而不是本地运行 ls 。
不过,我希望能够在本地运行的 csh 脚本内的反引号内执行此操作。这可能吗?
我知道可以通过 SSH 登录并运行远程脚本,但这不是我的情况。
我还听说可以通过 SSH 发送本地存储的第二个脚本(我也没有弄清楚),但我喜欢将所有命令都放在原始脚本中的想法,因此是 HEREDOC。
我知道这是一个非常特殊的问题,但如果有办法的话,知道如何做就非常酷了。
不起作用的事情
1)
`ssh user@host<<'ENDSSH'`
`echo "ls -l"`
`echo "ENDSSH"`
这给出了错误:
stty: standard input: Invalid argument.
stty: standard input: Invalid argument.
Warning: Command not found
然后它ls -l
在本地运行,然后它尝试ENDSSH
在本地运行,当然失败,找不到命令。
2)
`ssh user@host<<'ENDSSH'`
echo "ls -l"
echo "ENDSSH"
与上面的问题相同,只是它只显示ls -l
和ENDSSH
作为文本。有道理...因为 HEREDOC 部分失败了。
3)3-5 并不完全是我所问的,但仍在尝试让基本案例发挥作用。
`ssh user@host ls-l`
这返回total: Command not found.
是的,我不知道它来自哪里。
4)
`cat ./test.csh | ssh user@host`
也返回与尝试 #1 相同的结果
5)
`cat ./test.csh | ssh -t user@host`
与 #1 和 4 相同。
我开始用尽 stackoverflow/Ubuntu/serverfault...等的其他解决方案。大多数人询问如何从命令行在远程运行脚本,而不是如何从本地运行的脚本在远程运行命令。
编辑
嗯,我想我已经解决了部分问题。以上面的情况 3 为例,发生的情况是ls -l
在本地运行,然后输出的第一部分作为命令通过 SSH 发送。
我注意到这一点是因为我尝试过设置ssh user@host $CMD
为。输出是,然后我意识到 is来自 ls 输出。但仍然不确定如何解决这个问题$CMD
"whoami"
username: Command not found
total
答案1
如果您将要执行的整个命令包含在反引号内,那么您很可能会得到正确的解决方案。关于变量和其他插值元素的评估存在一些问题,但我暂时将这些问题放在一边。
但是,我不完全确定为什么你想要反引号中的任何内容。您的问题说您想远程运行本地脚本。你的第一个例子就是这样做的。
ssh -q user@host << ENDSSH
hostname
ls -l
id
ENDSSH
也许您想将远程执行的输出放入变量中?问题中的任何地方都没有这么说,但你会这样做(bash
)
result=$(ssh user@host <<'ENDSSH'
hostname
id
ENDSSH
)
...
echo "$result"
或者,既然你提到了csh
,就像这样
set result = `ssh -q user@host` <<ENDSSH
hostname
id
ENDSSH
...
echo "$result"
请注意,对于csh
变体,所有输出行都连接在一起。
我发现您报告了一个错误,stty: standard input: Invalid argument.
这可能是因为您stty
在远程服务器上的登录脚本中有一个命令。这应该包含在交互式 shell 的测试中。在bash
你会做这样的事情:
if test -n "$PS1"
then
# Interactive setup here
stty ...
fi
答案2
不确定你想做什么,但这对我有用。
R=`ssh -t hostname <<EOF
ls -l
EOF`
请注意,即使 stdio 被重定向,我直到 EOF 之后才关闭反引号,并使用 -t 选项创建虚拟 TTY。