Pense cuidadosamente sobre quando cada comando é executado, onde é executado e qual entrada recebe.
- 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. - Em seguida, o comando
ssh
é executado. Recebe o documento aqui expandido; estes são comandos que são executados no shell remoto. - 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. - O shell remoto executa
sudo su - someotheruser
. Isso executa um shell comosomeotheruser
, 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). - O shell executando como
someotheruser
executa os comandos que ele lê, se houver. - O shell executando como
someuser
executa o comandoif
(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