Не может ssh как пользователь tty-less

10

Я пытаюсь запустить одну команду, вызывая ssh (используя аутентификацию по ключу) от пользователя, у которого нет tty (пользователь, на котором работает мой сервер apache), и продолжаю получать следующий результат:

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.

Флаг -t устанавливается при вызове ssh. Ключ не имеет парольной фразы, которая должна подавлять необходимость какого-либо ввода, но, очевидно, это не так. Как я могу предотвратить ssh от попыток открыть / dev / tty?

Изменить: теги кода не работают?

Edit2: полная команда ssh:

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

Я заменил свое имя пользователя на «имя пользователя».

Edit3: я попробовал ssh-ing, используя тот же ключ, что и root, и получил такой результат:

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).

Он запрашивает у меня парольную фразу, хотя она не нужна. Кроме того, я могу использовать ключ ssh при использовании PuTTY на компьютере с Windows, и он не запрашивает у меня пароль.

Edit4: я добавил сервер для пользователей apache known_hosts, и теперь я получаю это:

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).`

Также это содержимое known_hosts:

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

Почему это говорит экдса? Это ключ RSA.

Edit5: решено. Проблема заключалась в том, что пара ключей была сгенерирована PuTTY, которая записывает закрытый ключ в формате, который не совместим с OpenSSH. Решение предоставлено cjc в комментарии.

сурьма
источник
Re: кодовый тег. Нет, либо код окружения с обратной галочкой, либо 4 пробела перед строкой.
cjc
Что за полная команда ssh?
cjc
Почему вы передаете -t?
Зоредаче
@Zoredache Думаю, это поможет. Какой-то сайт предложил это.
Сурма
1
@Surma, ecdsa ссылается на ключ сервера, а не ключ на клиенте.
amcnabb

Ответы:

11

Проблема на самом деле не в том, что она пытается прочитать фразу-пароль - это всего лишь предупреждение. Скорее, он пытается выполнить проверку ключа хоста, но не может. Если вы действительно хотите, чтобы он никогда не спрашивал о ключах хоста, рассмотрите возможность добавления следующих параметров в командную строку ssh:

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

Обратите внимание, что это может повлиять на безопасность, поэтому обязательно ознакомьтесь с этими параметрами на ssh_configстранице руководства .

РЕДАКТИРОВАТЬ: Учитывая ваши обновленные сообщения об ошибках, похоже, что у вас есть поврежденный файл идентификации (или, как указал cjc, он может быть в неправильном формате). Попробуйте создать новый вручную с помощью ssh-keygen и добавьте его в авторизованные ключи сервера.

amcnabb
источник
Вы, кажется, правы, я просто попытался использовать ключ от имени root. Результат в ОП.
Сурма
1
На самом деле, вместо использования StrictHostKeyChecking = no, вы также можете получить открытый ключ сервера и вставить его в пользовательский файл .ssh / known_host. Или поместите это в общесистемный файл known_hosts.
cjc
@cjc, я согласен, что обычно это лучшее решение.
amcnabb
@cjc Я скопировал известные_хосты от пользователя root (который добавил сервер к известным хостам) и настроил правильные разрешения. Теперь я получаю другой вывод, проверь ОП.
Сурма
1
@amcnabb Вы упомянули, что использовали ключ в PuTTY. Вы конвертировали ключ в OpenSSH?
CJC
0

Из интереса, то, что определено как окружающая среда /etc/passwd- отсутствие /bin/bash, вероятно, будет вашей проблемой.

Бен Лессани - Сонасси
источник
/ bin / false Я, вероятно, должен был упомянуть, что это запускается php, который, по-видимому, порождает оболочку, когда вы вызываете shell_exec () (именно это я и использую для запуска этого).
Сурма
1
Понял. Тогда в таком случае, почему вы не просто используете pecl.php.net/package/ssh2 - вместо того, чтобы взламывать с помощьюshell_exec()
Бен Лессани - Sonassi
Это хорошая идея.
Сурма
Конечно, вы должны действительно объяснить в своем вопросе, что вы пытаетесь сделать это через PHP - поскольку ответ, который я предоставил, является более точным для решения вашего вопроса.
Бен Лессани - Сонасси