这是我的简单 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
有很多方法可以做到这一点...这里列举一些:
以该用户身份登录:真的,
苏用户2
或者只是获得相同的环境,
su -l user2
以该用户身份执行单个命令:
su 用户2 -c cat myfile.txt
使用此处的文档:
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