我正在尝试设置一个脚本来测试用户,如果它不存在,我会将用户添加到服务器。现在我只是测试看看是否找到了我正在测试的内容,并且我可以根据返回的内容执行不同的操作。当我在 ssh 命令之后执行
echo "$BOBCHECK"
时,我确实会在它运行到我的服务器列表时得到找到或丢失的结果,所以我知道该部分正在按预期工作,并且我在循环周期内设置了变量。然而,我得到的 if 测试的唯一结果是“存在检查失败”的失败测试回显,就像变量已在 if 语句内重置一样。有人可以解释我在这里做错了什么吗?
#!/bin/bash
#
#
for hn in $(cat /root/scripts/linux/linhosts.lst); do
echo "" && echo "Checking for bob user on $hn" && BOBCHECK=$( ssh -t -oStrictHostKeyChecking=no "$hn" 'if getent passwd bob > /dev/null 2&>1; then echo "found"; else echo "missing"; fi' )
echo "$BOBCHECK"
if [ "$BOBCHECK" = "found" ]; then
echo "exist check complete, user found"
elif [ "$BOBCHECK" = "missing" ]; then
echo "exist check complete, user not there"
else
echo "exist check failed"
fi
done
Example output from the script running:
Checking for bob user on server42
Connection to server42 closed.
missing
exist check failed
Checking for bob user on server43
Connection to server43 closed.
missing
exist check failed
Checking for bob user on server44
Connection to server44 closed.
found
exist check failed
我尝试过双括号、双等于、嵌套 if 语句而不是 elif 语句,所有结果都相同。我什至尝试了“-eq”,我很快发现它只适用于整数而不是字符串。
如果将
ssh
与 -t
一起使用,它将把输出视为终端并将 \n
扩展为 \r\n
。
考虑(使用 bash printf):
$ printf '%q\n' "$(ssh -t user@host echo hmmm)"
Connection to host closed.
$'hmmm\r'
为避免这种情况,请勿使用
-t
:
$ printf "%q\n' "$(ssh user@host echo ok)"
ok