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