我试图在 bash 脚本中连接两个字符串,但无法获得预期的结果,
USERNAME="ubuntu"
MASTER="some IP"
KEYFILE="/Path/to/keyfile.pem"
STR1=`sudo ssh -q -t -o StrictHostKeyChecking=no -i $KEYFILE $USERNAME@$MASTER -p 22 'sudo hostname'`
STR2=`sudo ssh -q -t -o StrictHostKeyChecking=no -i $KEYFILE $USERNAME@$MASTER -p 22 "sudo grep search /etc/resolv.conf"`
STR2=`echo $STR2 | awk '{print $2}'`
echo $STR1
echo $STR2
STR3="$STR1""$STR2" #OR "$STR1$STR2" OR $STR1$STR2
echo "$STR3" # OR $STR3
OUTPUT:
ip-10-30-209-xx
ap-xxx-1.compute.internal
ap-xxx-1.compute.internal
我只得到第二个字符串,但第一个字符串被忽略。为什么我在这里没有得到预期的结果?
另一个有趣的点是,出于好奇,如果我以相反的顺序连接字符串,即STR3=$STR2$STR1
,输出甚至很奇怪..ie
ip-10-30-209-xx.compute.internal
。我在这里完全困惑了..
答案1
第二个字符串不会被忽略,而是被隐藏。要查看它,请运行
echo "$STR3" | cat -v
问题STR1
是以回车特点。该字符告诉终端将光标移回行首。它在正常的换行符之前发出。发出它的原因是您告诉 SSH 使用该选项模拟终端-t
,因此它正在安排正确显示的内容。当您捕获字符串中的输出时,这不会提供有用的结果。
您显示的命令可以以任何用户身份运行,因此您不需要 sudo。如果您不需要 sudo,则不需要-t
.
STR1=`ssh -q -i "$KEYFILE" "$USERNAME@$MASTER" -p 22 'hostname'`
STR2=`ssh -q -i "$KEYFILE" "$USERNAME@$MASTER" -p 22 "grep search /etc/resolv.conf" | awk {print $2}`
STR3="$STR1$STR2"
如果您的真实脚本绝对需要 sudo,请去掉回车符。
STR=`ssh -t … 'sudo mycommand' | tr -d '\r'`
将 ssh 和 sudo 结合起来很麻烦。坚持使用 SSH 来实现所有权限升级会更容易。这需要允许 root 帐户使用 SSH 登录。与您在其他地方读到的内容不同,这并不是本质上不安全。从本地用户到 root 的权限提升的风险往往被高估);如果攻击者可以访问 sudoer 帐户,那么他们无论如何都可以访问 root。但是,为了保留有用的日志,最好限制直接的访问 root 帐户。您只需将以下指令放入sshd_config
:即可授权本地用户访问 root 权限:
PermitRootLogin no
…
Match Address 127.0.0.1,::1
PermitRootLogin yes
Match User root
PasswordAuthentication no
GSSAPIAuthentication
KbdInteractiveAuthentication no
然后 root 将被允许通过 SSH 登录,但只能通过密钥身份验证并且只能通过 localhost 进行 root 登录。设置密钥后,您可以链接 SSH 登录:
STR=`ssh … 'ssh root@localhost "mycommand"'`
答案2
您没有向我们展示您的脚本的输出,或者您的 STR2 中有一些奇怪的值。
更新您的脚本以结尾:
#!/bin/bash
STR1="ip-10-30-209-xx"
STR2="a ap-xxx-1.compute.internal"
STR2=`echo $STR2 | awk '{print $2}'`
echo 'str1['$STR1']'
echo 'str2['$STR2']'
STR3="$STR1""$STR2" #OR "$STR1$STR2" OR $STR1$STR2
echo 'str3['"$STR3"']'
这使:
str1[ip-10-30-209-xx]
str2[ap-xxx-1.compute.internal]
str3[ip-10-30-209-xxap-xxx-1.compute.internal]
然后逐步的将作业替换为您自己的作业