Não é possível ssh como usuário com menos tty

10

Estou tentando executar um único comando invocando ssh (usando autenticação de chave) de um usuário que não possui um tty (o usuário que meu servidor apache está executando como) e continuo obtendo o seguinte resultado:

OpenSSH_5.9p1, OpenSSL 1.0.0g 18 Jan 2012
Pseudo-terminal will not be allocated because stdin is not a terminal.
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Connecting to localhost [::1] port 54367.
debug1: Connection established.
debug1: identity file nonpublic/id_rsa type 1
debug1: identity file nonpublic/id_rsa-cert type -1
debug1: Remote protocol version 2.0, remote software version OpenSSH_5.9
debug1: match: OpenSSH_5.9 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.9
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5 none
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: sending SSH2_MSG_KEX_ECDH_INIT
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug1: Server host key: ECDSA e3:c2:37:8e:8b:d4:77:63:7f:d2:ba:12:e5:e9:d1:9a
debug1: checking without port identifier
debug1: read_passphrase: can't open /dev/tty: No such device or address
Host key verification failed.

O sinalizador -t é definido ao chamar o ssh. A chave não possui uma senha, o que deve suprimir a necessidade de qualquer entrada, mas aparentemente não. Como posso impedir que o ssh tente abrir / dev / tty?

Editar: as tags de código não estão funcionando?

Edit2: Comando ssh completo:

ssh -i nonpublic/id_rsa -l username -p 54367 -t -v username@localhost /home/username/minecraftserver/Scripts/start 2>&1

Substituí meu nome de usuário por "nome de usuário".

Edit3: Tentei ssh-ing usando a mesma chave que root e obtive este resultado:

OpenSSH_5.9p1, OpenSSL 1.0.0g 18 Jan 2012
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Connecting to localhost [::1] port 54367.
debug1: Connection established.
debug1: permanently_set_uid: 0/0
debug1: identity file /srv/http/nonpublic/id_rsa type 1
debug1: identity file /srv/http/nonpublic/id_rsa-cert type -1
debug1: Remote protocol version 2.0, remote software version OpenSSH_5.9
debug1: match: OpenSSH_5.9 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.9
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5 none
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: sending SSH2_MSG_KEX_ECDH_INIT
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug1: Server host key: ECDSA e3:c2:37:8e:8b:d4:77:63:7f:d2:ba:12:e5:e9:d1:9a
debug1: checking without port identifier
The authenticity of host '[localhost]:54367 ([::1]:54367)' can't be established.
ECDSA key fingerprint is e3:c2:37:8e:8b:d4:77:63:7f:d2:ba:12:e5:e9:d1:9a.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[localhost]:54367' (ECDSA) to the list of known hosts.
debug1: ssh_ecdsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: Roaming not allowed by server
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /srv/http/nonpublic/id_rsa
debug1: Server accepts key: pkalg ssh-rsa blen 279
debug1: key_parse_private_pem: PEM_read_PrivateKey failed
debug1: read PEM private key done: type <unknown>
Enter passphrase for key '/srv/http/nonpublic/id_rsa':
debug1: No more authentication methods to try.
Permission denied (publickey).

Ele me solicita uma senha, mesmo que não precise de nenhuma. Além disso, eu posso usar a tecla ssh para usar PuTTY em uma máquina Windows muito bem e isso não me pede uma senha.

Edit4: adicionei o servidor aos usuários do apache known_hosts e agora recebo o seguinte:

OpenSSH_5.9p1, OpenSSL 1.0.0g 18 Jan 2012
Pseudo-terminal will not be allocated because stdin is not a terminal.
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Connecting to localhost [::1] port 54367.
debug1: Connection established.
debug1: identity file nonpublic/id_rsa type 1
debug1: identity file nonpublic/id_rsa-cert type -1
debug1: Remote protocol version 2.0, remote software version OpenSSH_5.9
debug1: match: OpenSSH_5.9 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.9
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5 none
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: sending SSH2_MSG_KEX_ECDH_INIT
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug1: Server host key: ECDSA e3:c2:37:8e:8b:d4:77:63:7f:d2:ba:12:e5:e9:d1:9a
debug1: Host '[localhost]:54367' is known and matches the ECDSA host key.
debug1: Found key in /srv/http/.ssh/known_hosts:1
debug1: ssh_ecdsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: Roaming not allowed by server
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Offering RSA public key: nonpublic/id_rsa
debug1: Server accepts key: pkalg ssh-rsa blen 279
debug1: key_parse_private_pem: PEM_read_PrivateKey failed
debug1: read PEM private key done: type
debug1: read_passphrase: can't open /dev/tty: No such device or address
debug1: No more authentication methods to try.
Permission denied (publickey).`

Além disso, este é o conteúdo de known_hosts:

[localhost]:54367 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBILr7jLp5CeYfyrCroaDjkaWgDHXRrQD+G8Fz/CQOY1PcluUFTkrN447bXmC6R27LOClE+RPaveYb4MOlObpGGE=

Por que diz ecdsa? É uma chave rsa.

Edit5: Resolvido. O problema era que o par de chaves foi gerado pelo PuTTY, que grava a chave privada em um formato incompatível com o OpenSSH. Solução fornecida pela cjc em um comentário.

Surma
fonte
Re: código tag. Não, envolva o código com back-tick ou coloque 4 espaços na frente da linha.
CJC
Qual é o comando ssh completo?
Cjc 21/03/12
Por que você está passando um -t?
Zoredache
@ Zoredache Pensei que iria ajudar. Algum site sugeriu.
Surma
1
@ Surma, ecdsa está se referindo à chave do servidor, não à chave do cliente.
Amcnabb 22/03/12

Respostas:

11

O problema não parece ser o fato de estar tentando ler a senha - isso é apenas um aviso. Em vez disso, está tentando verificar a chave do host, mas está falhando. Se você realmente deseja que ele nunca pergunte sobre as chaves do host, considere adicionar as seguintes opções à linha de comando ssh:

-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o GlobalKnownHostsFile=/dev/null

Observe que pode haver implicações de segurança, portanto, leia sobre essas opções na ssh_configpágina de manual.

EDIT: Dadas as suas mensagens de erro atualizadas, parece que você tem um arquivo de identidade corrompido (ou, como cjc apontou, pode estar no formato errado). Tente criar um novo manualmente com o ssh-keygen e adicione-o às teclas_autorizadas do servidor.

amcnabb
fonte
Você parece estar certo, apenas tentei usar a chave como raiz. Resultado em OP.
Surma
1
Na verdade, em vez de usar StrictHostKeyChecking = no, você também pode obter a chave pública do servidor e colá-la no arquivo .ssh / known_host do usuário. Ou coloque isso no arquivo known_hosts em todo o sistema.
Cjc 22/03/12
@ CCJ, eu concordo que geralmente é a melhor solução.
Amcnabb 22/03/12
@cjc Copiei o unknown_hosts da raiz (que adicionou o servidor aos hosts conhecidos) e configurei as permissões corretas. Agora eu recebo uma saída diferente, verifique o OP.
Surma
1
@amcnabb Você mencionou que usou a chave no PuTTY. Você converteu a chave em OpenSSH?
Cjc 22/03/12
0

Fora de interesse, o que é definido como o ambiente /etc/passwd- a falta de /bin/bashprovavelmente será o seu problema.

Ben Lessani - Sonassi
fonte
/ bin / false Eu provavelmente deveria ter mencionado que isso está sendo executado pelo php, que aparentemente gera um shell quando você chama shell_exec () (que é o que eu estou usando para executar isso).
Surma
1
Entendido. Então, nesse caso, por que você não apenas usando pecl.php.net/package/ssh2 - em vez de cortar completamente comshell_exec()
Ben Lessani - Sonassi
Isso é uma boa ideia.
Surma
Certamente, você deve realmente explicar na sua pergunta que está tentando fazer isso via PHP - pois a resposta que forneci é mais precisa para resolver sua pergunta.
Ben Lessani - Sonassi 22/03