这是我的脚本。我想用另一个用户登录并执行以下操作ls -lih
:
#!/bin/bash
su - testuser <<- _EOF_
123456 #password
_EOF_
ls -lih
这是我运行脚本时的输出:
./script.sh
-bash: line 1: 123456: command not found
total 127M
262210 drwxr-xr-x. 9 mazimi mazimi 156K Feb 14 19:05 Desktop
262211 drwxr-xr-x. 2 mazimi mazimi 36K Feb 14 18:26 Downloads
278106 -rw-r--r-- 1 mazimi mazimi 64K Feb 14 22:30 ems.cfg
... # list of files
它ls -lih
在我的主目录中不是吗testuser
?我应该如何修复它?
答案1
您的代码存在几个问题。
su
从 读取密码/dev/tty
,而不是从 读取密码stdin
,因此您不能像这样重定向密码。事实上,su
默认情况下是以目标用户身份启动 shell,因此如果您运行以下命令root
:su - testuser <<- _EOF_ 123456 #password _EOF_
将会
su
成功(root 不需要密码来执行此操作),但是将会123456
作为输入传递到用户的 shell,这就是为什么当您运行脚本时您会看到:-bash: line 1: 123456: command not found
如果您想以非 root 用户身份执行此操作,您可能应该遵循 bahamt 的建议并使用
sudo
,它可以配置为以不同用户身份提供对特定命令的无密码访问。即使
su
有效,它也会产生一个新的进程。在命令执行之前该su
命令已退出(并返回到原始帐户)ls
。所以你真正想要的是:su - testuser <<EOF ls -lih EOF
答案2
我想你会发现你无法修复它。我认为su
读取/dev/tty
密码,并且我相信您无法真正重定向到该神奇设备文件。
如果您使用的是 Linux,则可以使用 验证su
密码的读取内容strace
。
答案3
你真正想要使用的是sudo
.
你可能想开始这里。