命令工作正常,但通过 ssh 远程执行时失败

命令工作正常,但通过 ssh 远程执行时失败

当在服务器上运行时,以下命令可以在远程 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

你还没有解释你的意思“它失败“所以我只能猜测

  1. 您可以远程运行必要的部分,然后在本地运行其余部分,而不是打包整个管道来远程运行

     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')"
  1. 请记住,您的退出状态代码可能仅仅意味着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

相关内容