The*_*eLQ 10 shell bash ssh profile
在任何 sh shell 启动之前,我需要执行一些重要的命令。这是在 SSH 命令 ( ssh host somecommand) 和其他运行命令的程序中传递 SSH 命令所必需的。
在我的.profile我有这个:
ihammerhands@wreckcreations:~> cat .profile
#specific environment and startup programs
export PS1="\u@wreckcreations:\w> "
export PYTHONPATH=~/python/lib/python2.4/site-packages
export PATH=$PATH:~/bin:~/python/bin
Run Code Online (Sandbox Code Playgroud)
但是,这失败了:
W:\programming\wreckcreations-site\test-hg>ssh name@host echo $PATH
Enter passphrase for key '/home/Owner/.ssh/id_rsa':
/usr/local/bin:/bin:/usr/bin
Run Code Online (Sandbox Code Playgroud)
注意缺少的 PATH 选项
sh 配置文件的正确名称是什么?注意:我没有 root 访问权限,也不希望将其应用于其他用户。有没有另一种方法可以做到这一点?
编辑:它似乎/bin/sh链接到bash,这并不奇怪。令人惊讶的是,我的个人资料仍然被忽略。有什么建议?
Gil*_*il' 14
~/.profile仅由登录 shell 执行。调用 shell 的程序决定 shell 是否将是登录 shell(通过将 a-作为 shell 调用的第零个参数的第一个字符)。它通常不会在您登录执行特定命令时执行。
仅当您不指定命令时,OpenSSH 特别会调用登录 shell。因此,如果您确实指定了命令,~/.profile则不会被读取。
OpenSSH 允许在服务器端设置环境变量。这必须在服务器配置中使用PermitUserEnvironment指令启用。可以在文件中设置变量~/.ssh/environment。假设您使用公钥身份验证,您还可以在相关行的开头~/.ssh/authorized_keys添加 : addenvironment="FOO=bar"中的per-key 变量。
ssh 还支持发送环境变量。在OpenSSH的,使用SendEnv的指令~/.ssh/config。但是,必须使用AcceptEnv服务器配置中的指令启用特定的环境变量,因此这可能对您不起作用。
只要您使用公钥身份验证,我认为总是有效的一件事(奇怪的是)是(ab)使用文件中的command=选项authorized_keys。带command选项的键只适用于运行指定的命令;但是authorized_keys文件中的命令在环境变量SSH_ORIGINAL_COMMAND设置为用户指定的命令的情况下运行。如果用户未指定命令并因此期望交互式 shell,则此变量为空。所以你可以使用这样的东西~/.ssh/authorized_keys(当然,如果你不使用这个密钥进行身份验证,它将不适用):
command=". ~/.profile; if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then eval \"$SSH_ORIGINAL_COMMAND\"; else exec \"$SHELL\"; fi" ssh-rsa …
Run Code Online (Sandbox Code Playgroud)
另一种可能性是在服务器上编写包装脚本。类似于以下内容~/bin/ssh-wrapper:
#!/bin/sh
. ~/.profile
exec "${0##*/}" "$@"
Run Code Online (Sandbox Code Playgroud)
然后对这个名为rsync、unison等的脚本建立符号链接。--rsync-path='bin/rsync'在rsync命令行上传递,对其他程序依此类推。或者,某些命令允许您指定要远程运行的整个 shell 片段,这允许您使命令自包含:例如,对于 rsync,您可以使用--rsync-path='. ~/.profile; rsync'.
还有另一种途径取决于您的登录 shell 是 bash 还是 zsh。Bash 总是~/.bashrc在被 rshd 或 sshd 调用时读取,即使它不是交互式的(但如果它被称为 as 则不会sh)。Zsh 总是读取~/.zshenv.
## ~/.bashrc
if [[ $- != *i* ]]; then
# Either .bashrc was sourced explicitly, or this is an rsh/ssh session.
. ~/.profile
fi
## ~/.zshenv
if [[ $(ps -p $PPID -o comm=) = [rs]shd && $- != *l* ]]; then
# Not a login shell, but this is an rsh/ssh session
. ~/.profile
fi
Run Code Online (Sandbox Code Playgroud)
小智 8
似乎值得注意的是,您在问题中提到的命令
ssh name@host echo $PATH
Run Code Online (Sandbox Code Playgroud)
几乎永远不会有用。$PATH 的变量替换由您的本地 shell 完成,并传递给 ssh,后者在远程系统上执行 echo 以打印路径变量的内容,因为它在您的本地系统上扩展。这是我在 Mac 和网络上的 Linux 机器之间执行类似操作的示例:
LibMBP:~ will$ echo $PATH
/opt/local/bin:/opt/local/sbin:/Users/will/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/texbin:/usr/X11/bin
LibMBP:~ will$ ssh warren echo $PATH
will@warren's password:
/opt/local/bin:/opt/local/sbin:/Users/will/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/texbin:/usr/X11/bin
LibMBP:~ will$ ssh warren 'echo $PATH'
will@warren's password:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
LibMBP:~ will$
Run Code Online (Sandbox Code Playgroud)
请注意我需要如何使用引号来防止本地 shell 扩展变量。
| 归档时间: |
|
| 查看次数: |
14764 次 |
| 最近记录: |