Почему мне нужен tty для выполнения sudo, если я могу sudo без пароля?

Даже мысль, Вы изменили размер базового устройства в своем VM, никто не сказал фактической файловой системе, что свободное место изменилось. Ваша таблица партона на диске, вероятно, не изменилась также. Так, ext3 рассматривает Ваш корневой раздел как запускающийся в секторе X и заканчивающийся в секторе Y. То, что Вы сделали в расширении размера VDI, было, добавляют секторы в конец VDI. Таким образом, Ваш ext3 раздел, начинающийся в секторе X все еще только, расширяется на сектор Y.

В чем Вы нуждаетесь, теперь должен сделать еще две вещи. Обновите таблицу разделов так, чтобы/dev/sda запустился в секторе X и теперь расширился на недавно доступный сектор Z, затем необходимо сказать ext3 (ext2 действительно), что это может расшириться в новое пространство. В некоторых операционных системах это сделано с простым growfs -M /device команда. В Linux кажется, что это более сложно, и включает преобразование Вашей ext3 фс к ext2 (путем удаления журнала), затем расширения раздела.

http://www.howtoforge.com/linux_resizing_ext3_partitions

Тот сайт имеет все шаги, в которых Вы будете нуждаться.

227
14.11.2017, 04:14
7 ответов

Вероятно, это потому, что ваш файл / etc / sudoers (или любой файл, который он включает) имеет:

Defaults requiretty

... что делает sudo требует TTY. Известно, что системы Red Hat (RHEL, Fedora ...) требуют наличия TTY в файле по умолчанию sudoers . Это не дает реальных преимуществ в плане безопасности и может быть безопасно удалено.

Red Hat признала проблему , и она будет устранена в следующих выпусках.

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

-tt предназначен для интерактивного использования. Он переводит локальный терминал в режим raw , чтобы вы могли взаимодействовать с удаленным терминалом.Это означает, что если ssh I / O не от / до терминала, это будет иметь побочные эффекты. Например, весь ввод будет повторен, специальные терминальные символы ( ^? , ^ C , ^ U ) вызовут специальную обработку; на выходе LF будут преобразованы в CRLF s ... (см. этот ответ на Почему этот двоичный файл изменяется? для получения дополнительной информации) подробности.

Чтобы минимизировать влияние, вы можете вызвать его как:

ssh -tt host 'stty raw -echo; sudo ...' < <(cat)

<<(cat) позволит избежать установки локального терминала (если есть) в raw ]. И мы используем stty raw -echo , чтобы установить линейную дисциплину удаленного терминала как проходную (эффективно, чтобы он вел себя как канал, который использовался бы вместо псевдотерминала без -tt , хотя это применимо только после выполнения этой команды, поэтому вам нужно отложить отправку чего-либо для ввода до тех пор, пока это не произойдет).

Обратите внимание, что, поскольку вывод удаленной команды будет идти на терминал, это по-прежнему будет влиять на его буферизацию (которая будет линейной для многих приложений) и эффективность использования полосы пропускания, поскольку TCP_NODELAY включен. Также при установке -tt , ssh s IPQoS до lowdelay в отличие от пропускной способности . Вы можете обойти и то и другое с помощью:

ssh -o IPQoS=throughput -tt host 'stty raw -echo; sudo cmd | cat' < <(cat)

Также обратите внимание, что это означает, что удаленная команда не может определить конец файла на своем стандартном вводе, а стандартный вывод и стандартный поток удаленной команды объединены в один поток.

Так что, в конце концов, не так уж и хорошо.

Если у вас есть способ создать псевдотерминал на удаленном хосте (например, с помощью expect , zsh , socat , ] perl IO :: Pty ...), тогда было бы лучше использовать это для создания псевдотерминала для присоединения sudo к (но не для I / O) и используйте ssh без -t .

Например, с expect :

ssh host 'expect -c "spawn -noecho sh -c {
     exec sudo cmd >&4 2>&5 <&6 4>&- 5>&- 6<&-}
 exit [lindex [wait] 3]" 4>&1 5>&2 6<&0'

Или с скриптом (здесь предполагается реализация из util-linux ):

ssh host 'SHELL=/bin/sh script -qec "
              sudo cmd <&3 >&4 2>&5 3<&- 4>&- 5>&-
            " /dev/null 3<&0 4>&1 5>&2'

(при условии ( для обоих), что оболочка входа удаленного пользователя похожа на Bourne).

291
27.01.2020, 19:28

По умолчанию SUDO настроен на использование TTY. То есть ожидается, что SUDO будет запускаться из оболочки входа в систему. Вы можете обойти это требование, добавив переключатель -t к вашему вызову SSH:

ssh -t someserver sudo somecommand

-t принудительно выделяет псевдотерминал.

Если вы хотите выполнить это глобально, измените / etc / sudoers , указав ! Requiretty . Это можно сделать на уровне пользователя, группы или на всеобъемлющем уровне.

30
27.01.2020, 19:28

Используйте флаг -t для ssh , чтобы принудительно выделить tty.

$ ssh luci tty
not a tty
$ ssh luci -t tty
/dev/ttys003
$
18
27.01.2020, 19:28

Я столкнулся с этой проблемой, используя Docker и Centos 7. В итоге я сделал следующее:

yum install -y sudo

sed -i -e 's/Defaults requiretty.*/ #Defaults requiretty/g' /etc/sudoers

Я нашел этот хак на https://hub.docker.com/r/liubin/fluentd-agent/~/dockerfile

11
27.01.2020, 19:28

Интересной альтернативой является использование FreeIPA или IdM для централизованного управления пользователями и правилами sudoer. Затем вы можете создать правила sudo и назначить опцию

!requiretty

в правиле. После этого команда будет выполняться, как и ожидалось. Вы также получите преимущества управления всеми серверами и пользователями из единого набора конфигураций.

1
27.01.2020, 19:28

У меня была такая же проблема. В моем случае решением были две строки

myscript=$(cat ssh_test.sh)
ssh -t user@host "$myscript"

Пояснение:

  • Поместите команды, которые вы хотите запустить (, включая команды sudo ), в скрипт, например. "ssh _test.sh".

  • Считайте весь скрипт в переменную с именем "myscript".

  • Вызовите ssh всего одним -t и введите переменную вместо команды.

До этого я сталкивался с проблемами при использовании комбинации чтения из стандартного ввода и использования heredocs

0
27.01.2020, 19:28

Еще одна опция, которую я не увидел в ответах ни на один из таких вопросов, это open_init_pty. Я не смог изменить конфигурацию sudo, а также предоставить -опцию t в любом количестве (на самом деле вы ничего не можете сделать, если ssh вызывается Java-программой, такой как bamboo или что-то подобное ). Внезапно man -k ptyрешил мою проблему.

Итак, я решил изменить sh very_useful_script.shна /usr/sbin/open_init_pty /bin/sh very_useful_script.sh. Вы не можете вызвать sudoнапрямую, например open_init_pty sudo -u wildfly id.

1
20.01.2021, 13:27

Теги

Похожие вопросы