通过 su 登录后将环境变量导出到用户

通过 su 登录后将环境变量导出到用户

我正在努力弄清楚以下别名到底是做什么的。我猜它正在使环境变量COUNTER可供用户使用,nobodyCOUNTER=${COUNTER}前面的 ssh 和SendEnv COUNTER树桩我。我查过手册页,但我一无所知。

COUNTER=280
...
alias run='COUNTER=${COUNTER} ssh nobody@localhost -o "SendEnv COUNTER"'

我想在没有 ssh 的情况下重写这个别名(因为它已被禁用)。这是我的尝试,但如果我不明白原始别名的确切作用,我不确定我是否做了正确的事情。

alias run='su - nobody -c "export COUNTER=${COUNTER}"'

答案1

  1. 在程序运行之前为同一行/同一语句中的变量赋值暂时地将该变量导出到正在运行的程序的环境中。这是导出变量的一种方法只有一个程序- 一旦该程序运行,它就不再存在于环境中,并且不会影响或可供任何后续程序使用。

    COUNTER=${COUNTER} ssh ...将 $COUNTER 设置为其自身,暂时将其导出到环境中,然后运行ssh​​.

    它可能是由不明白花括号或引号的用途的人编写的,因为COUNTER=$COUNTER它们 100% 等效,而且COUNTER="$COUNTER"会更好,只是因为双引号变量是一种很好的做法,除非您完全确定您不想要并确切地知道为什么在这种特定情况下您不想这样做。看$VAR 与 ${VAR} 以及引用或不引用

  2. -o "SendEnv COUNTER"是一个ssh选项,用于告知ssh应将哪些本地环境变量发送到远程服务器。默认情况下,仅TERM发送(即使如此,仅当请求 aa pty 时,例如交互式 ssh 连接,您可以在其中键入远程 shell/程序并查看其输出)。从man ssh_config

    SendEnv

    指定应将本地的哪些变量environ(7)发送到服务器。服务器也必须支持它,并且服务器必须配置为接受这些环境变量。请注意,TERM每当请求伪终端时,总会根据协议的要求发送环境变量。有关如何配置服务器的信息,请参阅AcceptEnvsshd_config(5)变量由名称指定,名称可以包含通配符。多个环境变量可以用空格分隔或分布在多个SendEnv指令中。

    有关模式的更多信息,请参阅模式。

    可以通过在模式前加上前缀 来清除先前设置的 SendEnv 变量名称-。默认情况下不发送任何环境变量。

    请注意,远程服务器可以并且将会忽略任何发送的变量,除非它被配置为接受它们。默认情况下,它只接受TERM.从man sshd_config

    AcceptEnv

    指定客户端发送的哪些环境变量将被复制到会话的environ(7).请参阅SendEnvSetEnvssh_config(5) 了解如何配置客户端。TERM每当客户端请求伪终端时,环境变量总是被接受,因为它是协议所要求的。

    变量由名称指定,名称可能包含通配符 *?。多个环境变量可以用空格分隔或分布在多个 AcceptEnv 指令中。请注意,某些环境变量可用于绕过受限的用户环境。因此,使用该指令时应小心。默认不接受任何环境变量。

    这意味着,除非/etc/ssh/sshd_config在远程服务器上(实际上localhost在您的示例中,但对于此目的来说仍然足够“远程”)配置为接受 COUNTER 变量,否则您的COUNTER=${COUNTER} ssh nobody@localhost -o "SendEnv COUNTER"命令不会执行任何ssh nobody@localhost不会执行的操作做。

  3. su - nobody -c "export COUNTER=${COUNTER}将以export COUNTER=${COUNTER}用户无人身份运行,然后退出(因为该-c选项告诉su运行该命令代替只是给你一个 shell,在给你 shell 之前它不会运行它)。尝试COUNTER="$COUNTER" su - nobody一下。或者只是export COUNTER让它位于您运行的所有程序的环境中。

相关内容