Sudo sobre SSH passando uma senha, não é necessário tty:
Você pode usar o sudo sobre ssh sem forçar o ssh a ter um pseudo-tty (sem o uso da opção ssh "-t") dizendo ao sudo para não exigir uma senha interativa e apenas pegar a senha do stdin. Você faz isso usando a opção "-S" no sudo. Isso faz com que o sudo escute a senha no stdin e pare de ouvir quando vir uma nova linha.
Exemplo 1 - Comando Remoto Simples
Neste exemplo, enviamos um whoami
comando simples :
$ ssh user@server cat \| sudo --prompt="" -S -- whoami << EOF
> <remote_sudo_password>
root
Estamos dizendo ao sudo para não emitir um prompt e receber sua entrada do stdin. Isso faz com que a senha do sudo passe completamente silenciosa, de modo que a única resposta que você recebe é a saída whoami
.
Essa técnica tem o benefício de permitir que você execute programas através do sudo over ssh, os quais requerem entrada stdin. Isso ocorre porque o sudo está consumindo a senha na primeira linha do stdin e, em seguida, permitindo que qualquer programa executado continue a pegar o stdin.
Exemplo 2 - Comando remoto que requer seu próprio stdin
No exemplo a seguir, o comando remoto "cat" é executado através do sudo, e estamos fornecendo algumas linhas extras através do stdin para o gato remoto exibir.
$ ssh user@server cat \| sudo --prompt="" -S -- "cat" << EOF
> <remote_sudo_password>
> Extra line1
> Extra line2
> EOF
Extra line1
Extra line2
A saída demonstra que a <remote_sudo_password>
linha está sendo consumida pelo sudo e que o gato executado remotamente está exibindo as linhas extras.
Um exemplo de onde isso seria benéfico é se você deseja usar o ssh para passar uma senha para um comando privilegiado sem usar a linha de comando. Digamos, se você deseja montar um contêiner criptografado remoto sobre ssh.
Exemplo 3 - Montagem de um contêiner VeraCrypt remoto
Neste script de exemplo, estamos montando remotamente um contêiner VeraCrypt através do sudo sem nenhum texto extra de solicitação:
#!/bin/sh
ssh user@server cat \| sudo --prompt="" -S -- "veracrypt --non-interactive --stdin --keyfiles=/path/to/test.key /path/to/test.img /mnt/mountpoint" << EOF
SudoPassword
VeraCryptContainerPassword
EOF
Deve-se observar que em todos os exemplos de linha de comando acima (tudo, exceto o script), a << EOF
construção na linha de comando fará com que tudo que for digitado, incluindo a senha, seja gravado no arquivo .bash_history da máquina local . Portanto, é altamente recomendável que, para uso no mundo real, você o faça inteiramente por meio de um script, como o exemplo veracrypt acima, ou, se na linha de comando, coloque a senha em um arquivo e redirecione-o através do ssh.
Exemplo 1a - Exemplo 1 sem senha de linha de comando local
O primeiro exemplo seria assim:
$ cat text_file_with_sudo_password | ssh user@server cat \| sudo --prompt="" -S -- whoami
root
Exemplo 2a - Exemplo 2 sem senha de linha de comando local
e o segundo exemplo seria:
$ cat text_file_with_sudo_password - << EOF | ssh va1der.net cat \| sudo --prompt="" -S -- cat
> Extra line1
> Extra line2
> EOF
Extra line1
Extra line2
Colocar a senha em um arquivo separado é desnecessário se você estiver colocando a coisa toda em um script, pois o conteúdo dos scripts não termina no seu histórico. Ainda pode ser útil, no entanto, caso você queira permitir que usuários que não devem ver a senha executem o script.
ssh <user@server> sudo <script>
, como eu estava recebendo o errosudo: no tty present and no askpass program specified