用于 sshpass 远程服务器并获取 grep 结果的 shell 脚本

用于 sshpass 远程服务器并获取 grep 结果的 shell 脚本

我正在编写一些脚本来使用 sshpass 获取远程服务器命令的结果。

在尝试多个远程主机之前,我尝试仅使用一台测试服务器进行测试以获得命令结果。

该命令用于检查主机中是否存在该用户。如果用户存在,我想打印结果。所以,我编码如下。

#!/bin/bash
exec sshpass -pMY_PASSWORD ssh -o StrictHostKeyChecking=no root@IP_ADDRESS grep USER /etc/passwd | cut -f1 -d:

if [ $? -ne 0 ]
    then 
        echo "command failed..."
        exit 1
fi

但是如果我尝试上面的脚本,它会打印一些服务器登录消息和下面的错误。

basename: extra operand `tty'
Try `basename --help' for more information.
basename: extra operand `tty'
Try `basename --help' for more information.

我只想在用户存在且没有这些错误的情况下获得结果。

有人可以帮忙吗?

答案1

远程服务器的登录 shell 配置文件中的代码编写得很差,无法处理此类非交互式登录。解决这个问题,basename问题tty就会消失。 (在远程系统上,暂时重命名 root 的.profileand.bash_profile并尝试使用您的ssh -o StrictHostKeyChecking=no root@IP_ADDRESS id。如果您仍然收到错误,则说明是在系统登录脚本中;如果没有,则说明是在 root 的登录脚本中。它们可能不保护ttywith的使用[ -t 1 ] && ...

但是,由于您正在用来exec运行该sshpass程序,因此您向我们展示的脚本的其余部分都不会运行。消除exec。 (永远不要使用它,直到您知道为什么确实需要使用它。)但即使您这样做,测试成功的下一个代码段也只会检查管道中最后一个命令的结果,即。cut,这是极不可能失败的。

您使用sshpass嵌入式明文密码而不是ssh基于证书的身份验证是否有任何特殊原因?

您以 root 用户身份而不是非特权帐户登录远程系统是否有任何特殊原因?

相关内容