我正在使用shell模块执行以下命令
tasks:
- name: Command
shell: "sshpass -p 123 ssh -o 'StrictHostKeyChecking no' root@10.67.13.50 shell << EOF n whoaminEOF | cat"
我得到以下错误
"stderr_lines": [
"/bin/sh: line 2: warning: here-document at line 0 delimited by end-of-file (wanted `EOF')",
"Warning: Permanently added '10.67.13.50' (ECDSA) to the list of known hosts.",
"bash: shell: command not found"
]
我的命令出了什么问题?
tl;dr您可以a(用sh
或bash
替换shell
,或者b(用whoami
替换shell
并删除heredoc。
让我们分解shell
命令:
sshpass -p 123 ssh -o 'StrictHostKeyChecking no' root@10.67.13.50 shell << EOF n whoaminEOF | cat
这里有几个过程。
- 具有两个子流程的
sh
管道:sshpass
,然后作为子流程运行…ssh
,连接到10.67.13.50
并运行…以n whoamin
为标准输入的shell
- …和
cat
,后者从sshpass
过程层次结构获得输出
有几个潜在的错误:
-
您可以安全地从管道中删除
cat
。正如@KamilCuk所提到的,
cat
从它的输入中读取并写出它。它在这里什么也没做;它既没用也没害处。 -
shell
不是远程服务器上的命令(10.67.13.50
(。如果要运行shell,通常会使用sh
或bash
。 -
此外,您可以将整个
shell … EOF
序列替换为whoami
。<< EOF n whoami nEOF
是一个heredoc,用于告诉远程服务器上的shell要执行哪些命令。但是,只有一个命令被执行。
总之,shell:
行可以重写为:
sshpass -p 123 ssh -o 'StrictHostKeyChecking no' root@10.67.13.50 whoami
…这是一个奇怪的命令,因为我们知道远程用户root
。