sudo: sorry, you must have a tty to run sudo

11 May 2018

Потребовалось выполнить команду из-под sudo на удаленном сервере.

Самое простое, что могло прийти в голову - это использовать stdin чтобы передать пароль для sudo (скрипт не ждет пользовательского ввода).

$ ssh server "echo password | sudo command"

Увы. Было получено сообщение из заголовка статьи.

Почему вообще такое происходит? Причина в том, что конфиг /etc/sudoers содержит опцию (если ее нет, то включите :))

Defaults requiretty
 requiretty If set, sudo will only run when the user is logged in  
 to a real tty. When this flag is set, sudo can only be  
 run from a login session and not via other means such  
 as cron(8) or cgi-bin scripts. This flag is off by  
 default.  

Как обойти эту опцию не правя конфиги? Довольно просто.

Нам потребуется использовать опцию -t для ssh, которая заставляет клиента принудительно открывать псевдотерминал даже если нужды в нем нет (работаем с stdin). А для sudo потребуется опция -S, которая заставляет считывать пароль из stdin.

$ ssh -t server "echo password | sudo -S command"

Работает.