Файл init в вызовах init.d с использованием sudo в script.sh выдает ошибку sudo: tty отсутствует и не задана программа askpass

Я пытаюсь создать скрипт, который запускается при загрузке, для подключения к моей личной VPN.

У меня есть файл инициализации: /etc/init.d/vpnstartup

, который вызывает мой скрипт vpnon.sh при загрузке с помощью команд:

case "$1" in
    start)
        su username -c $VPN_DIR/vpnon.sh
        ;;

в моем В сценарии vpnon.sh есть команды, для выполнения которых требуются права root:

sudo iptables -A INPUT -i pptp -j ACCEPT
sudo iptables -A OUTPUT -o pptp -j ACCEPT

Я предоставляю разрешения для файла инициализации vpnstartup и сценария vpnon.sh с помощью chmod 775, когда проверяю свой файл инициализации, вызывая это с помощью ./vpnstartup start

Я получаю следующую ошибку, когда вызывается команда sudo iptables

sudo: no tty present and no askpass program specified
sudo: no tty present and no askpass program specified

, что, как мне кажется, происходит, команда sudo требует ввода пароля, но никак не может чтобы получить это.

Единственное решение, которое я нашел, было добавление NOPASSWD :ALL option в файл sudoers под моим именем пользователя.

Я не хочу использовать этот метод по соображениям безопасности, если есть лучшее решение.

Пожалуйста, дайте мне знать, если вы можете помочь мне с этой проблемой; Я потратил на это много часов.

1
задан 18 March 2015 в 07:54

2 ответа

Я думаю что-то, что является ключевым фактором, вот то, что, потому что скрипт запущен с sudo, он может сделать все, что корень может сделать. Проблема состоит в том, что другие команды sudo в рамках того сценария не обязательно наследовали корневые полномочия, но выполняются как пользователь управления. Это может часто производить ошибку, которую Вы видите от sudo, даже если сам родительский сценарий позволяется через sudo, но подкоманды не.

То, что происходит, является вложенным вызовом sudo в рамках того сценария, перестал работать, потому что sudo обычно запрашивал бы пароль, но нет никакой оболочки управления, таким образом, он не может. Это генерирует немного неоднозначное sudo: no tty present and no askpass program specified ошибка, которую Вы видите.

Простой способ проиллюстрировать это состоит в том, если, как Ваш пример, init сценарий содержит внутренние вызовы с помощью sudo. Выполнение:

sudo /etc/init.d/startvpn

может перестать работать, если Ваш собственный пользователь не имеет sudo прав на все вызовы sudo в и мог бы дать Вам sudo tty ошибка. Однако выполняя его как это:

sudo sh /etc/init.d/startvpn

вероятно, работал бы. В последнем случае, sudo sh создает командный процессор как корень, таким образом, что-либо, что выполняется в той оболочке на самом деле, выполняется как корень. Корень обычно имеет неограниченные sudo полномочия, таким образом, больше не имеет значения, если команда выполняется с sudo или нет.

Некоторые вещи, которые стоит упомянуть:

  • Как другие указали, большей части этой путаницы можно избежать, не используя sudo в рамках сценариев. Часто подкоманды, которые перестали работать, когда выполнено с sudo, могут хорошо работать без него (когда родительский скрипт запущен с sudo).
  • При запущении скрипта с sudo sh может решить проблему, снова существуют последствия безопасности к выполнению так. Полагайте, что sudo ведет себя этот путь как проверка работоспособности, чтобы гарантировать, что содержание сценария не делает чего-то, что они не были должны, даже если сам сценарий позволяется.
  • Если пользователь, Вы выполняете sudo, равно как и имеет достаточные общие полномочия, Вы не можете видеть ни одну из этих проблем. Но они могут появиться позже, сказать, разрабатываете ли Вы сценарий со своей собственной привилегированной учетной записью, и в производстве это, работал как непривилегированная сервисная учетная запись.
  • В целом необходимо постараться не давать широкие sudo разрешения к учетным записям пользователей как способ решить этот вид проблемы. Если действительно необходимый, ограничьте правила доступа к счету тем пользователем и что определенная команда.
1
ответ дан 7 December 2019 в 14:00

Я нашел решение проблемы.

я удалил все отдельные команды sudo в моем vpnon.sh сценарии и передал в sudo от за пределами сценария.

В моем/etc/init.d/vpnstartup файле, я изменился su username -c на sudo $VPN_DIR/vpnon.sh, который похож на это теперь:

case "$1" in
    start)
        sudo $VPN_DIR/vpnon.sh
        ;;

тогда названный sudo update-rc.d vpnstartup defaults и теперь VPN соединяется на запуске! :)

1
ответ дан 18 March 2015 в 07:54

Другие вопросы по тегам:

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