Исправляем ошибку «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» решена.
Еще иногда помогает добавить `-tt` двойная `t` аллоцирует не псевдо tty а tty даже если его нет.