3

Это мой простой 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 является /bin/sh

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

3 ответа3

7

Есть много способов сделать это ... вот некоторые:

  1. войдите под этим пользователем: по-настоящему,

    su user2

или просто получить ту же среду,

  su -l user2
  1. выполнить одну команду от имени этого пользователя:

    su user2 -c cat myfile.txt

  2. используйте здесь документы:

    sudo su user <<EOF

    command1

    command2

    .....

    EOF

Ваши команды могут потерпеть неудачу, потому что /tmp/script.sh не является исполняемым, или потому что последнее эхо в one.sh не имеет соответствующей вершины (").

3

Используйте sudo и предоставьте своему (оригинальному) пользователю разрешение на запуск /tmp/script.sh от имени нужного пользователя без пароля:

original_user ALL=(script_user) NOPASSWD: /tmp/script.sh

Вызовите так:

sudo -u script_user /tmp/script.sh

Тем не менее, это ужасная идея делать что-либо, имеющее отношение к общедоступному каталогу. Вы просто просите об этом, делая это.

2

Я получил ответ здесь

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .