Как ssh получает пароль от tty? - PullRequest
0 голосов
/ 26 марта 2019

Мне было интересно, как openssh получает пароль при входе в систему, потому что я застрял в автоматическом вводе паролей к аналогичным инструментам в linux, который требует получения пароля от tty, например, ssh.

Попытался понять sshpass и обнаружил, что sshpass разветвляет дочерний процесс с тем же pid и затем вводит пароль под дочерним процессом.

Не знаю, было ли мое предположение правильным, что ssh нужно проверить правильный pid, поскольку я не могу подключиться к текущему tty, используя другой процесс для ввода пароля ssh.

1 Ответ

1 голос
/ 26 марта 2019

По соображениям безопасности, многие программы требуют пароль от пользователей в интерактивном режиме. Довольно много программ используют следующий вид проверки перед считыванием пароля из stdin:

if (isatty(STDIN_FILENO) == 0)
{
    exit(EXIT_FAILURE); 
}

Таким образом, программа допускает пароль только с терминала. Таким образом он пытается предотвратить ввод неинтерактивного пароля.

sshpass - это просто инструмент для:

обманывает ssh, думая, что он получает пароль от интерактивного пользователя. [из справочной страницы sshpass]

Для обмана ssh, sshpass создает и открывает псевдотерминал и дает это для стандартного ввода ssh. fork() необходим, потому что sshpass должен записать пароль для ssh через псевдотерминал.

Таким образом, stdin процесса ssh является терминалом, и тест isatty будет пройден.

...