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"'`
答え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]
それからゆっくり課題を自分の課題に変える