Primeira linha faltando na concatenação da saída SSH [fechada]

0

Estou tentando concatenar duas strings no script bash, mas não consigo obter o resultado esperado,

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

Estou obtendo apenas a segunda string, mas a primeira string está sendo ignorada. Por que não estou obtendo o resultado esperado aqui?

outro ponto interessante é, por curiosidade, se eu concatenar as strings na ordem inversa, ou seja, STR3=$STR2$STR1 , a saída é ainda mais estranha ... ou seja, %código%. Estou totalmente confuso aqui ..

    
por Suraj 21.02.2016 / 16:16

2 respostas

1

A segunda string não é ignorada, está oculta. Para ver, corra

echo "$STR3" | cat -v

O problema é que STR1 termina com um caractere retorno de carro . Esse caractere diz ao terminal para mover o cursor de volta para o começo da linha. É emitido logo antes do caractere normal de nova linha (feed de linha). A razão pela qual ele é emitido é que você disse ao SSH para emular um terminal com a opção -t , portanto, ele está organizando as coisas para que sejam exibidas corretamente. Isso não fornece um resultado útil quando você está capturando a saída em uma string.

Os comandos que você mostra podem ser executados como qualquer usuário, assim você não precisa do sudo. Se você não precisa de sudo, não precisa de -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"

Se o seu script real precisar de sudo, tire os caracteres de retorno de carro.

STR='ssh -t … 'sudo mycommand' | tr -d '\r''

Combinar ssh e sudo é complicado. É mais fácil manter o SSH para todo o escalonamento de privilégios. Isso requer que a conta root efetue login com o SSH. Ao contrário do que você pode ter lido em outro lugar, isso não é inerentemente inseguro. Os riscos de elevação de privilégios do usuário local para a raiz tendem a ser superestimados ; Se um invasor tiver acesso a uma conta sudoer, ele terá acesso ao root mesmo assim. No entanto, para manter registros úteis, é melhor restringir o acesso direto à conta raiz. Você pode autorizar o acesso ao root apenas para usuários locais, colocando as seguintes diretivas em sshd_config :

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

Em seguida, o root terá permissão para efetuar login através do SSH, mas apenas com a autenticação de chave e apenas pelo enraizamento do host local. Depois de configurar as chaves, você pode encadear os logins SSH:

STR='ssh … 'ssh root@localhost "mycommand"''
    
por 21.02.2016 / 23:05
0

Você não está nos mostrando a saída do seu script ou há alguns valores estranhos em seu STR2.

Atualize seu script para terminar em:

#!/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"']'

que dá:

str1[ip-10-30-209-xx]
str2[ap-xxx-1.compute.internal]
str3[ip-10-30-209-xxap-xxx-1.compute.internal]

então stepwise substitua as atribuições pelo seu próprio

    
por 21.02.2016 / 19:07