SSH 输出串联中缺少第一行

SSH 输出串联中缺少第一行

我试图在 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]

然后逐步的将作业替换为您自己的作业

相关内容