我正在编写一些脚本来使用 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 的.profile
and.bash_profile
并尝试使用您的ssh -o StrictHostKeyChecking=no root@IP_ADDRESS id
。如果您仍然收到错误,则说明是在系统登录脚本中;如果没有,则说明是在 root 的登录脚本中。它们可能不保护tty
with的使用[ -t 1 ] && ...
)
但是,由于您正在用来exec
运行该sshpass
程序,因此您向我们展示的脚本的其余部分都不会运行。消除exec
。 (永远不要使用它,直到您知道为什么确实需要使用它。)但即使您这样做,测试成功的下一个代码段也只会检查管道中最后一个命令的结果,即。cut
,这是极不可能失败的。
您使用sshpass
嵌入式明文密码而不是ssh
基于证书的身份验证是否有任何特殊原因?
您以 root 用户身份而不是非特权帐户登录远程系统是否有任何特殊原因?