Как войти в систему как root из Bash и делать что-то

Это мой простой баш:

cat test.sh #!/bin/bash echo "hello" su - root -c /path/to/script.sh <<EOF password EOF whoami echo "good bye" 

Но я получаю эту ошибку:

 ./test.sh hello su: must be run from a terminal <current-user> good bye 

(ИЛИ)

 cat test2.sh #!/bin/bash echo "hello" sudo su <<EOF password EOF whoami echo "good bye" 

Опять другая ошибка

(ИЛИ)

 cat test3.sh #!/bin/bash echo "hello" su root <<EOF password EOF whoami echo "good bye" 

снова ошибка …

когда я пытаюсь:

 #!/bin/bash echo "hello" sudo -s <<EOF <password> echo Now I am root id echo "yes!" EOF whoami echo "good bye" 

Затем вывод:

 ./script.sh hello [sudo] password for <user>: 

Я также изменил свой сценарий на:

 #!/usr/bin/expect -f spawn sudo -s <<EOF expect "assword for user:" send -- "password\r" expect eof 

и выход:

 spawn sudo -s <<EOF [sudo] password for user: /bin/bash: <<EOF: command not found 

Также, which sh выход which sh /bin/sh

Как я могу разрешить ошибку в этих трех сценариях?

  • Как использовать sudo -i в сценарии оболочки
  • Безопасное хранение необработанных изображений на USB-накопителях
  • sudo: ./server: команда не найдена
  • разрешено отклонение ошибки ubuntu с помощью sudo
  • Отсутствуют параметры административной панели Webmin.
  • Получить iSerial с lsusb без sudo
  • Разница между sudo su - пользователем и пользователем sudo -iu
  • Как автоматически ввести льготный период sudo при входе в CLI?
  • 4 Solutions collect form web for “Как войти в систему как root из Bash и делать что-то”

    Вы можете передать пароль и отправить его в команде внутри скрипта.

     echo "password" | sudo -S 

    Но не стоит посылать пароль в командной строке. Если вам нужна дополнительная информация о том, как входить в систему как root из сценария, вы можете посмотреть ответ, указанный здесь .

    Однако, если это для экспериментальных целей, мы можем использовать ожидание ввода пароля из командной строки. Сценарий необходимо изменить, как показано ниже.

     #!/usr/bin/expect -f spawn sudo -s <<EOF expect "assword for username:" send -- "user-password\r" expect eof 

    Последняя строка необходима, так как нам нужно нажать Enter после ввода пароля. Как предположил Тиан, не рекомендуется отправлять пароль root в сценарий оболочки.

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

    Использование sudo – лучший способ, который является более гибким, вы можете настроить его, чтобы разрешить только определенным командам или даже определенным пользователям запускать программу / скрипт с использованием пароля или без него ( man sudo ).

    @ Ссылка Кетана тоже стоит прочитать.

    Я ОТВЕТА ОТ ОТ.

    Выполнение такого рода вещей небезопасно или стандартная практика (на самом деле многие считают это катастрофическим), на самом деле не стоит вводить пароль в скрипт. Более стандартным подходом было бы просто ожидать, что весь скрипт будет выполнен с привилегиями root или просто для запроса пароля для пароля. Вы также можете разрешить выполнение различных команд через sudo без пароля отдельными пользователями, используя опцию NOPASSWD в /etc/suoders .

    Однако теперь, когда вы знаете о рисках, можно использовать sudo -kS чтобы sudo считывал пароль из stdin :

     sudo -kSs << EOF password whoami echo "Not a good idea to have a password encoded in plain text" EOF 

    Вы пробовали / etc / sudoers?

     your_user ALL=(ALL) NOPASSWD: /path/to/script.sh 

    (отредактируйте с помощью: sudoedit / etc / sudoers), тогда вы сможете запустить:

     sudo /path/to/script without password 
    Linux и Unix - лучшая ОС в мире.