在Bash脚本中执行sudo命令时如何隐藏所有输出(含密码提示)
解决sudo -S仍显示密码提示的问题
你遇到的问题是因为[sudo] password for username:这个提示是sudo程序本身输出到标准错误(stderr)的,而你原来的重定向只针对后面的cp命令,并没有覆盖sudo自己的错误输出。这里有两个简单的解决方法:
方法1:重定向sudo的标准错误流
把重定向操作直接应用到整个sudo命令上,这样就能把sudo的提示信息也丢到/dev/null里:
echo "mypassword" | sudo -S cp -u /scripts/.bashrc ~/ 2>/dev/null
如果同时想隐藏cp命令的标准输出和错误,可以写成:
echo "mypassword" | sudo -S cp -u /scripts/.bashrc ~/ >/dev/null 2>&1
这样整个sudo+cp组合的所有输出(包括sudo的提示)都会被丢弃。
方法2:让sudo不输出密码提示
sudo提供了-p参数,可以自定义密码提示字符串。我们可以把它设为空字符串,这样sudo就不会输出任何提示了:
echo "mypassword" | sudo -S -p "" cp -u /scripts/.bashrc ~/ >/dev/null 2>&1
这个方法更直接,从根源上阻止了提示信息的产生。
关于安全的补充
正如你提到的,把明文密码写在脚本里确实不是最安全的做法。即使是内部服务器,也建议:
- 把包含密码的脚本权限设置为
chmod 600 your_script.sh,确保只有你自己能读取 - 考虑使用sudoers文件配置免密执行特定命令(比如给你的用户授权无需密码执行
cp /scripts/.bashrc ~/),这样完全不需要在脚本里写密码
内容的提问来源于stack exchange,提问作者JoBe
相关产品推荐
相关产品推荐

