SSH出力接続の最初の行がありません。

SSH出力接続の最初の行がありません。

Bashスクリプトで2つの文字列を連結しようとしたが、期待した結果を得ることはできません。

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

2番目の文字列だけが取得されましたが、最初の文字列は無視されます。ここで期待した結果が得られないのはなぜですか?

もう一つの興味深い点は、好奇心から文字列を逆順に連結すると、STR3=$STR2$STR1出力が奇妙になることですip-10-30-209-xx.compute.internal。ここで完全に混乱しています..

ベストアンサー1

2番目の文字列は無視されずに隠されます。表示するには実行してください。

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を使用する方が簡単です。これを行うには、SSHを使用してrootアカウントにログインできるようにする必要があります。他の場所で読むことができるものとは異なり、これは本質的に安全ではありません。ローカルユーザーでは、root として特権の昇格のリスクが過大評価されます。)攻撃者がsudoerアカウントにアクセスできる場合、rootにもアクセスできます。ただし、便利なログを維持するには、ログを制限するのが最善です。直接ルートアカウントにアクセスします。次のディレクティブを入力すると、ローカルユーザーにroot権限へのアクセス権を付与できますsshd_config

PermitRootLogin no
Match Address 127.0.0.1,::1
    PermitRootLogin yes
Match User root
     PasswordAuthentication no
     GSSAPIAuthentication
     KbdInteractiveAuthentication no

これにより、ルートはSSHを介してログインできますが、キー認証とlocalhostを介してのみログインできます。キーを設定したら、SSHログインに接続できます。

STR=`ssh … 'ssh root@localhost "mycommand"'`

おすすめ記事