我知道已经有人问过类似的问题,但我还没有看到这种确切情况的答案(尽管如果确实重复,请随意关闭)。
我在公司网络上,因此无权修改该/etc/sudoers
文件。
我们用来sudo -u svc_produser -i
将用户切换到交互式 shell。每次,都会提示我输入密码。我想要一种自动传递密码的方法,并且如果可能的话,在以服务用户身份登录时立即运行命令。
我无法通过管道输入密码,因为-i
不适用于-S
( --stdin
)。
在以前的公司,我通过脚本实现了这一expect
目标,但我也没有可用的脚本。
我确实有可用的 Python,但我希望有一种简单的 Bash-y 方法来实现这一点。
答案1
是的,您可以使用 Askpass 选项来执行此操作。从man sudo
:
-A, --askpass
通常,如果 sudo 需要密码,它会从用户的终端读取密码。如果指定了-A(askpass)选项,则执行(可能是图形的)帮助程序来读取用户的密码并将密码输出到标准输出。如果设置了 SUDO_ASKPASS 环境变量,它将指定帮助程序的路径。
因此,以最简单的形式,您可以编写一个打印出密码的脚本:
$ cat ~/scripts/foo.sh
#!/bin/sh
printf '%s\n' this_is_my_password
然后将SUDO_ASKPASS
变量设置为指向它:
export SUDO_ASKPASS=/home/terdon/scripts/foo.sh
然后你跑
sudo -A -u svc_produser -i
对于交互式 shell,如果您只想运行命令,则可以
sudo -A -u svc_produser command
例如,在我的系统上:
$ sudo -A whoami
root
现在看来,这显然是非常不安全的。您可以通过创建一个只有您可读的文件并将您的密码存储在其中来使其稍微好一些:
$ printf 'this_is_my_password\n' > ~/.hidden_file
$ chmod 600 ~/.hidden_file
更好的是,不要使用,printf
而是打开编辑器窗口并写入密码,因为printf
上述方法将使密码以明文形式出现在您的历史记录中。更好的是,将其存储在仅在启动时解密的加密卷中。您可以进行各种调整和改进,以使其更安全。