como executar comandos no servidor remoto como usuário diferente

3

Estou tentando conectar-me ao servidor B do servidor A usando ssh e executando comandos usando algum outro usuário. Contudo, quando tento procurar um padrão no arquivo de log, ele diz "não é possível abrir o arquivo de log" abaixo está o código de exemplo

ssh  -t user@hostname <<EOF
sudo su - someotheruser
a='tail -10 /somepath/application.log | awk '/Agent Exited/ { print $3 }''
if [ $a -eq 0 ] 
then
echo "Success"
else
echo "Failure"
fi 
EOF

depois de executar o script, diz: unable to open "tail........."

Eu não posso ficar logado no servidor B e executar vários comandos.

    
por Shyam 02.04.2015 / 07:14

3 respostas

3

Pense cuidadosamente sobre quando cada comando é executado, onde é executado e qual entrada recebe.

  1. Primeiro, o documento aqui é expandido. Isso significa que o tail / awk pipe é executado no host local e a substituição de variável $a também.
  2. Em seguida, o comando ssh é executado. Recebe o documento aqui expandido; estes são comandos que são executados no shell remoto.
  3. O shell remoto é executado sem argumentos, portanto, ele lê comandos para executar a partir da entrada padrão. Esses comandos incluem sudo , mas possivelmente (dependendo do shell) algumas das seguintes linhas também.
  4. O shell remoto executa sudo su - someotheruser . Isso executa um shell como someotheruser , que lê e executa primeiro o .profile do usuário e, em seguida, lê os comandos de sua entrada padrão. A entrada padrão contém o que o primeiro shell remoto não leu, o que é um pouco imprevisível (depende do shell e de quanto isso aconteceu para ler do seu canal de entrada).
  5. O shell executando como someotheruser executa os comandos que ele lê, se houver.
  6. O shell executando como someuser executa o comando if (se for lido).

Para evitar a expansão do documento, use aspas ao redor do marcador Heredoc. Para evitar a mistura profana de entradas padrão, use sh -c … ou seja explícito quanto ao que o segundo shell remoto recebe como entrada.

ssh  -t user@hostname <<'SSH_EOF'
sudo su - someotheruser <<'SU_EOF'
a='tail -10 /somepath/application.log | awk '/Agent Exited/ { print $3 }''
if [ "$a" -eq 0 ] 
then
echo "Success"
else
echo "Failure"
fi
SU_EOF
SSH_EOF

Você realmente precisa fornecer someotheruser do .profile ? Caso contrário, use sudo -u someotheruser . Se você fizer isso, use sudo -i -u someotheruser . Ajuste seus sudoresers de acordo.

A leitura do arquivo de log é a única coisa que requer privilégios elevados, portanto, faria sentido apenas executar o comando tail como someotheruser .

ssh -t user@hostname <<'SSH_EOF'
a='sudo -u someotheruser tail -10 /somepath/application.log | awk '/Agent Exited/ { print $3 }''
if [ "$a" -eq 0 ] 
then
echo "Success"
else
echo "Failure"
fi
SSH_EOF

Você tornará sua vida mais fácil se você não combinar métodos de escalonamento de privilégios. Em vez de usar sudo para alternar de someuser para someotheruser , use SSH para localhost. Encadear dois comandos ssh é fácil. Configure uma chave - você pode até mesmo configurar uma chave que permite apenas executar um comando específico como tail -10 /somepath/application.log . Defina um alias em seu .ssh/config para SSH por meio da conta someuser :

Host hostname-someotheruser
HostName hostname
UserName someotheruser
ProxyCommand ssh someuser@hostname

Em seguida, execute

a=$(ssh hostname-someotheruser tail -10 /somepath/application.log |
    awk '/Agent Exited/ { print $3 }')
if [ "$a" -eq 0 ] 
then
  echo "Success"
else
  echo "Failure"
fi
    
por 03.04.2015 / 01:17
1

Se as instruções não forem comandos e precisarem ser interpretadas por um shell. Você pode tentar isso. Crie um script local

a='tail -10 /somepath/application.log | awk '/Agent Exited/ { print $3 }''
[ $a -eq 0 ] && echo "Success" || echo "Faiilure"

e invocar o shell bash para executar esses comandos

ssh  -t user@hostname 'echo "pass" | sudo -Sv && bash -s' < script.sh
    
por 02.04.2015 / 07:47
0

Do que você descreveu, acho que há dois problemas. Primeiro, você não precisa do < . De acordo com a página de manual de ssh , a string que segue o nome do host será reconhecida imediatamente como o comando executado no remoto. Para executar vários comandos, você pode colocá-los em uma única string entre aspas. A string será enviada para o remoto e executada como um script.

ssh -t user@hostname 'tail -10 /somepath/application.log | awk \'/Agent Exited/ { print $3 }\'; if [ $a -eq 0 ]; then echo "Success"; else echo "Failure"; fi'
    
por 02.04.2015 / 08:05