使用此处脚本 I/O 重定向与 su 命令

使用此处脚本 I/O 重定向与 su 命令

这是我的脚本。我想用另一个用户登录并执行以下操作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

您的代码存在几个问题。

  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,它可以配置为以不同用户身份提供对特定命令的无密码访问。

  2. 即使su有效,它也会产生一个新的进程。在命令执行之前该su命令已退出(并返回到原始帐户)ls。所以你真正想要的是:

    su - testuser <<EOF
    ls -lih
    EOF
    

答案2

我想你会发现你无法修复它。我认为su读取/dev/tty密码,并且我相信您无法真正重定向到该神奇设备文件。

如果您使用的是 Linux,则可以使用 验证su密码的读取内容strace

答案3

你真正想要使用的是sudo.

你可能想开始这里

相关内容