在这里使用带有 su 命令的脚本 I/O 重定向

Maj*_*imi 2 su

这是我的脚本。我想用另一个用户登录并执行以下操作ls -lih

#!/bin/bash

su - testuser <<- _EOF_
    123456 #password
    _EOF_

ls -lih
Run Code Online (Sandbox Code Playgroud)

这是我运行脚本时的输出:

./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
Run Code Online (Sandbox Code Playgroud)

ls -lih在我的主目录中不是testuser吗?我该如何解决?

lar*_*sks 6

您的代码有几个问题。

  1. su从 读取密码/dev/tty,而不是从stdin,因此您不能像这样重定向密码。事实上,su默认情况下是作为目标用户启动一个shell,所以如果你运行它root

    su - testuser <<- _EOF_
    123456 #password
    _EOF_
    
    Run Code Online (Sandbox Code Playgroud)

    su会成功(根并不需要密码才能做到这一点),但123456将得到作为输入用户的外壳,这就是为什么当你运行你的脚本,你看到过:

    -bash: line 1: 123456: command not found
    
    Run Code Online (Sandbox Code Playgroud)

    如果您想以非 root 用户身份执行此操作,您可能应该遵循 bahamt 的建议并使用sudo,它可以配置为以不同用户身份提供对特定命令的无密码访问。

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

    su - testuser <<EOF
    ls -lih
    EOF
    
    Run Code Online (Sandbox Code Playgroud)