如何从 Bash 以 root 身份登录并执行操作

如何从 Bash 以 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输出也是/bin/sh

我该如何解决这三个脚本中的错误?

答案1

有很多方法可以做到这一点...这里列举一些:

  1. 以该用户身份登录:真的,

    苏用户2

或者只是获得相同的环境,

  su -l user2
  1. 以该用户身份执行单个命令:

    su 用户2 -c cat myfile.txt

  2. 使用此处的文档:

    sudo su user <<EOF

    command1

    command2

    .....

    EOF

您的命令可能会失败,因为 /tmp/script.sh 不可执行,或者因为 one.sh 中的最后一个 echo 没有匹配的 apex ( ")。

答案2

使用sudo并授予您的(原始)用户以所需用户身份无需密码运行 /tmp/script.sh 的权限:

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

像这样调用:

sudo -u script_user /tmp/script.sh

但是,对于任何与世界可写目录相关的内容,这样做都是一个糟糕的想法。这样做只会自找麻烦。

答案3

我得到了答案这里

做这种事情既不安全也不标准(事实上很多人认为这是灾难性的),在脚本中输入密码真的不是一个好主意。更标准的做法是简单地期望整个脚本以 root 权限执行,或者只是让脚本提示输入密码。您还可以使用NOPASSWD中的选项允许特定用户通过 sudo 运行各种命令而无需密码/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

相关内容