Como executar múltiplos comandos sudo através da conexão ssh já aberta

1

Estou tentando navegar de um servidor "USER1" para outro usando o ssh como usuário "USER2".

ssh -t $hostname "sudo su - USER2; whoami; pwd"

Posto executando o acima, eu sou capaz de navegar com sucesso para o servidor como USER2, mas os comandos à direita ou seja, "whoami e pwd" não estão sendo executados.No entanto, ao sair da sessão ssh USER1 é processado na saída seguido por o diretório de trabalho atual.

Eu não quero fazer nenhuma alteração no arquivo ssh known hosts.

    
por dnup1092 08.07.2015 / 17:51

1 resposta

5

Você está executando o comando sudo su - USER2; whoami; pwd no host remoto. Vamos decompor isso:

  • Os comandos separados por um ponto-e-vírgula são executados em sequência. Assim, o comando sudo su - USER2 é executado primeiro; em seguida, quando terminar, whoami será executado e, finalmente, pwd será executado.
  • O comando sudo su - USER2 inicia um shell de login como usuário USER2. Este shell lê os comandos da entrada padrão até que seja solicitado a sair (por exemplo, com o exit builtin) ou até detectar um fim de arquivo na entrada padrão. Como a entrada padrão está conectada ao terminal, ele espera que você digite comandos.

Se você quer executar comandos como USER2, você precisa passá-los como argumentos para sudo . Executar su não é útil aqui, o sudo já sabe como fazer isso. Você não precisa da opção -t para SSH, a menos que queira interagir com os comandos remotos (isso inclui o caso em que você precisa digitar uma senha para o sudo).

ssh -t "$remotehost" 'sudo -i -u USER2 sh -c "whoami; pwd"'

Se a configuração do sudo permitir que você execute programas como root, e não como um usuário arbitrário (o que não altera nada em termos de segurança), você precisará manter o sudo su . Nesse caso, passe a opção -c para su para executar o comando shell especificado.

ssh -t "$remotehost" 'sudo su -c "whoami; pwd" USER2'

Se você precisar ler o .profile do usuário, faça isso explicitamente.

ssh -t "$remotehost" 'sudo su -c ". ~/.profile; whoami; pwd" USER2'

Como alternativa, você pode passar os comandos como entrada padrão para um shell interativo. O encanamento é um pouco delicado, já que a entrada padrão do ssh deve permanecer no terminal. Uma vantagem dessa abordagem com um documento aqui é que a cotação no comando shell permanece relativamente simples: escape ' as '\'' para o shell remoto, nenhum escape é necessário para o shell remoto.

ssh -t "$remotehost" 'sudo su - USER2 <<\EOF
whoami
pwd
EOF'
    
por 09.07.2015 / 02:19