Исправляем ошибку «sudo: sorry, you must have a tty to run sudo»

Исправляем ошибку «sudo: sorry, you must have a tty to run sudo»

Недавно, используя ssh команду (для примера приведу ее):

ssh -p 2231 User_of_Backup@Server_IP_Backup sudo mv /home/User_of_Backup/HostName-* /home/getdb/remote_dump/Home_Dir*

Получил ошибку:

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

Это говорит о том, что вероятно,  вы работаете на Linux дистрибутиве с sudo который настроен так, чтобы запрашивать TTY. Это правило прописано в /etc/sudoers при наличии Defaults requiretty. В некоторых дистрибутивах это правило встроено в качестве конфигурации по умолчанию. RedHat, недавно удалили его из Fedora и REHL см Bug 1020147.

Исправляем ошибку «sudo: sorry, you must have a tty to run sudo»

Чтобы отключить requiretty глобально или просто к одной команде, можно несколькими способами:

  • Заменить значения по умолчанию «Defaults !requiretty» в /etc/sudoers файле. Это повлияет на вашу глобальную конфигурацию SUDO. В качестве альтернативы, вы можете изменить эту конфигурацию для каждого пользователя, для каждой группы или для командны:
Defaults!/path/to/my/bin !requiretty
Defaults:myuser !requiretty

Чтобы это сделать, выполните команду:

# visudo

Найти строку:

Defaults    requiretty

Закомментируйте линии или удалите строку:

#Defaults requiretty

PS: Или используйте строки, которые я привел выше.

  • Второй вариант — это использование опции «-t» в ssh:
-t Force pseudo-tty allocation. This can be used to execute arbitrary screen-based programs on a remote
machine, which can be very useful, e.g. when implementing menu services. Multiple -t options force
tty allocation, even if ssh has no local tty.

Команды могут выглядеть так:

# ssh -t host_or_IP sudo your_command_here
# ssh -t your_host_user@host_or_IP sudo your_command_here
# ssh -tyour_host_user@host_or_IP sudoyour_command_here /path_to_your_file
  • Третий вариант — использование команды без опции «-t» в ssh:

Имеется спицифика выполнения команд на различных Linux дистрибутивах, например в RHEL/CentOS:

# su --session-command="/path_to_your_command some_arg_number_1 some_arg_number_2"

Для других:

# su -c '/path_to_your_command some_arg_number_1 some_arg_number_2'

ИЛИ:

# ssh your_ssh_user@linux-notes.org su --session-command="/path_to_your_command some_arg_number_1 some_arg_number_2"

ИЛИ:

# ssh your_some_ssh_user@linux-notes.org -c '/path_to_your_command some_arg_number_1 some_arg_number_2'

Можно запустить /my_script_path/job66 как «my_user» пользователь который имеет синтаксис:

# ssh ssh_user@linux-notes.org su --session-command="/my_script_path/my_job /nas" my_user

ИЛИ:

# ssh user_of_ssh@linux-notes.org su captain_user -c "/my_script_path_here/my_job /nas"

Другой вариант заключается в использовании следующего синтаксиса:

# echo -e "\n"|sudo -S your_some_command_here

Все, ошибка «sudo: sorry, you must have a tty to run sudo» решена.

One thought on “Исправляем ошибку «sudo: sorry, you must have a tty to run sudo»

  1. Еще иногда помогает добавить `-tt` двойная `t` аллоцирует не псевдо tty а tty даже если его нет.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.