我正在努力弄清楚以下别名的确切作用。COUNTER
我猜它是让用户可以使用环境变量,nobody
但COUNTER=${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}"'
在程序运行之前为同一行/同一语句中的变量分配一个值临时将该变量导出到正在运行的程序的环境。这是一种只为一个程序导出变量的方法——一旦该程序运行,它就不再在环境中,也不会影响或可供任何后续程序使用。
COUNTER=${COUNTER} ssh ...
将 $COUNTER 设置为自身,暂时将其导出到环境中,然后运行ssh
.它可能是由不了解花括号或引号的用途的人编写的,因为它们
COUNTER=$COUNTER
100% 等效,而且COUNTER="$COUNTER"
会更好,只是因为双引号变量是一种很好的做法,除非您绝对确定不想要并确切地知道为什么你不想在那种特殊情况下。请参阅$VAR 与 ${VAR} 并引用或不引用-o "SendEnv COUNTER"
是一个ssh
选项,它告诉ssh
应该将哪些本地环境变量发送到远程服务器。默认情况下,仅TERM
发送(即使这样,也仅在请求 a pty 时,例如交互式 ssh 连接,您可以在其中键入远程 shell/程序并查看其输出)。来自man ssh_config
:请注意,远程服务器可以并且将忽略任何发送的变量,除非它被配置为接受它们。默认情况下,它只接受
TERM
. 来自man sshd_config
:这意味着,除非
/etc/ssh/sshd_config
在远程服务器上(实际上localhost
在您的示例中,但仍然有资格作为“远程”-ish 足以达到此目的)配置为接受 COUNTER 变量,否则您的COUNTER=${COUNTER} ssh nobody@localhost -o "SendEnv COUNTER"
命令不会做任何不会做ssh nobody@localhost
的事情做。su - nobody -c "export COUNTER=${COUNTER}
将以export COUNTER=${COUNTER}
用户nobody 运行,然后退出(因为该-c
选项告诉su
运行该命令而不是只给你一个shell,它在给你一个shell 之前不会运行它)。试试COUNTER="$COUNTER" su - nobody
吧。或者只是export COUNTER
让它在您运行的所有程序的环境中。