当在服务器上运行时,以下命令可以在远程 AiX 服务器上正常工作。
ls -ltr /tmp/*.pid | grep "$(date '+%b %e')"
输出:
-rwx-rwx-rw-- ........ Oct 1 /tmp/new.pid
echo $?
0
我希望使用运行上述命令ssh
,但失败了。请参阅下面的输出:
ssh [email protected] -C 'ls -ltr /tmp/*.pid | grep "$(date "'"+%b %e"'")"'
echo $?
1
注意:该命令通过 ansible 自动化从"$(date '+%b %e')"
获取。grep "$(date "'"+%b %e"'")"
-name: Chek is pid file was modified today
raw: "ls -ltr /tmp/{{ another_folder }}/*.pid | grep \"$(date '+%b %e')\""
register: pidfiledet
您能否建议我如何解决此问题并让命令远程运行?
更新:我运行了用户在答案和评论部分中建议的命令,但是 ssh 失败。以下是调试模式下失败的 ssh 输出,以获取建议的答案。
$ ssh -vvv -C -o ControlMaster=auto -o ControlPersist=60s -o 'IdentityFile="/app/mysshkeys/id_rsa"' -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o 'User="tbaadm"' -o ConnectTimeout=10 -o StrictHostKeyChecking=no -o ControlPath=/home/targetuser/.ansible/cp/f623d39604 -tt 10.9.9.12 'ls -ltr /tmp/prjfolder/bin/*.pid | grep "$(date +%b\ %e)"'
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 58: Applying options for *
debug3: kex names ok: [curve25519-sha256,[email protected],diffie-hellman-group14-sha1,diffie-hellman-group14-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,diffie-hellman-group-exchange-sha1,diffie-hellman-group-exchange-sha256,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,gss-gex-sha1-,gss-group14-sha1-]
debug1: auto-mux: Trying existing master
debug2: fd 3 setting O_NONBLOCK
debug2: mux_client_hello_exchange: master version 4
debug3: mux_client_forwards: request forwardings: 0 local, 0 remote
debug3: mux_client_request_session: entering
debug3: mux_client_request_alive: entering
debug3: mux_client_request_alive: done pid = 73756
debug3: mux_client_request_session: session request sent
debug1: mux_client_request_session: master session id: 2
debug3: mux_client_read_packet: read header failed: Broken pipe
debug2: Received exit status from master 1
Shared connection to 10.9.9.12 closed.
请注意,上面使用 ssh 传递的命令在目标主机上本地执行时工作正常!
答案1
不幸的是,我不熟悉ansible
,但由于它似乎ansible
在混合中,并且问题是另一个进程以中断引用的方式翻译命令,也许消除命令该部分中的引用可能会有所帮助。
可能值得尝试像这样的基本命令:
ls -ltr /tmp/*.pid | grep "$(date +%b\ %e)"
问题仍然是译者是否也会打破这一点。
答案2
你还没有解释你的意思“它失败“所以我只能猜测
您可以远程运行必要的部分,然后在本地运行其余部分,而不是打包整个管道来远程运行
ssh [email protected] -C 'ls -ltr /tmp/*.pid' | grep "$(date '+%b %e')"
这样做的最大优点(当然,在我看来)是保持引用简单明了。您必须平衡通过网络管道的数据量和时区可能的差异(在 的实例中
date
)
如果您知道源计算机的时区,则date
即使在本地运行时也可以指示使用它,例如
ssh [email protected] -C 'ls -ltr /tmp/*.pid' | grep "$(TZ=Europe/Paris date '+%b %e')"
请记住,您的退出状态代码可能仅仅意味着
grep
无法匹配任何内容。我不知道在你的情况下这本身是否是一个错误,但ssh
返回其命令的最终退出状态是正常行为ssh remoteHost true; echo SS=$? SS=0 ssh remoteHost false; echo SS=$? SS=1
答案3
我不了解 Ansible,但这是有效的 ssh 命令:
ssh [email protected] 'touch /tmp/test.pid; ls -ld /tmp/*.pid | grep -- "$(date "+%b %d")"'
注意:即使您已GNU!binutils
安装在 AIX 服务器上,通过 ssh 执行的命令也会使用不包含/opt/freeware/bin
或 的最小路径/usr/local/bin
,因此如果您想使用,请使用完整路径GNU!ls
:
ssh [email protected] 'touch /tmp/test.pid; /usr/local/bin/ls -ld /tmp/*.pid | grep -- "$(date "+%b %e")"'
编辑:关于date
%-sequences:与、GNU!lsAIX!ls
兼容。%d
%e