如何在 shell 脚本中发送 sudo 密码

如何在 shell 脚本中发送 sudo 密码

我的 shell 脚本(没有 EXPECT,也不可能)运行一个模拟其他用户的 shell 脚本。假设以下脚本名为 ,toto1.sh并以名为 的用户身份运行MYUSERNAME1

#!/bin/sh
su - MYUSERNAME2 ./app/sh/toto2.sh

我的脚本停止了,提示输入密码请求......

我如何发送 的密码MYUSERNAME2

答案1

如果你有空sudo,解决方案已经发布在数字地点

echo <password> | sudo -S -u <user> <command>

man sudo

-S, --stdin 将提示写入标准错误并从标准输入读取密码,而不是使用终端设备。密码后面必须跟换行符。

答案2

方法 1-从文件读取

您可以将密码保存在用户的只读文件中,并将内容传递给 sudo 命令。

这将避免密码被存储在 shell 历史记录中

# Save the password in the hidden file
echo "password" > ~/.password

# Update the permissions to allow only the user to read it
chmod 400 ~/.password 

# Pass the password over STDIN to sudo
☠ cortex ☠ [~] cat ~/scripts/login_file.sh
cat ~/.password | sudo -S su

# Execute the script
☠ cortex ☠ [~] bash ~/scripts/login_file.sh 
[sudo] password for cortex: 
☠ cortex ☠ [~] 

方法 2 - 保存到临时环境变量

使用这种方法,您需要在 shell 或脚本中输入。

☠ cortex ☠ [~] cat ~/scripts/login.sh 
my_password='password'                  # SET PASSWORD
echo "$my_password" | sudo -S su        # INVOKE sudo WITH PASSWORD

与脚本结合

使用上面提到的任何一种方法并进行身份验证,sudo 然后以 root 访问权限调用命令。

☠ cortex ☠ [~] cat ~/scripts/login.sh 
# SET PASSWORD
my_password='password'

# INVOKE sudo WITH PASSWORD
echo "$my_password" | sudo -S su;

# INVOKE COMMANDS WITH ROOT ACCESS
sudo -i <<'EOF'
    echo "Now i am $(whoami)"
    echo "$(id)"
EOF

☠ cortex ☠ [~] bash ~/scripts/login.sh 
[sudo] password for cortex: Now i am root
uid=0(root) gid=0(root) groups=0(root)

减少混乱ALIAS

让 sudo 在内部获取密码并进行身份验证。你不需要每次都通过 STDIN 输入密码

# Create the alias with the Approach 1
☠ cortex ☠ [~] echo "alias sudo=\"cat ~/.password | sudo -S\"" >> ~/.bashrc 

# OR Create the alias with the Approach 2
☠ cortex ☠ [~] echo "alias sudo=\"echo \"password\" | sudo -S\"" >> ~/.bashrc 

# Re-load the environment
☠ cortex ☠ [~] . ~/.bashrc 

# Use sudo directly - No need to pass on password everytime
☠ cortex ☠ [~] sudo whoami
root

相关内容