我有一个命令,如果我ssh登录到一台机器并运行它,那么它可以正常运行,但是当我尝试使用远程ssh命令运行它时则失败了:
ssh user@IP <command>
使用这两种方法比较“env”命令的输出结果会得到不同的环境变量。当我手动登录到机器上并运行“env”命令时,获取到的环境变量要比执行以下命令时少:
ssh user@IP "env"
有什么想法吗?
我有一个命令,如果我ssh登录到一台机器并运行它,那么它可以正常运行,但是当我尝试使用远程ssh命令运行它时则失败了:
ssh user@IP <command>
使用这两种方法比较“env”命令的输出结果会得到不同的环境变量。当我手动登录到机器上并运行“env”命令时,获取到的环境变量要比执行以下命令时少:
ssh user@IP "env"
有什么想法吗?
不同类型的shell有所区别。SSH命令执行shell是非交互式shell,而您普通的shell则是登录shell或交互式shell。以下来自man bash的描述:
登录shell是其第一个参数的第一个字符为 - ,或使用--login选项启动的shell。
交互式shell是没有非选项参数和没有使用-c选项启动的shell,并且其标准输入和错误输出都连接到终端(由isatty(3)确定),或使用-i选项启动的。如果bash是交互式的,则设置PS1和$-包括i,允许shell脚本或启动文件测试此状态。
下面的段落描述了bash如何执行其启动文件。如果存在任何文件但无法读取,则bash会报告错误。在扩展节中,文件名中的波浪号将扩展为下面所述。
当bash作为交互式登录shell或使用--login选项启动的非交互式shell时,它首先从文件/etc/profile中读取并执行命令,如果该文件存在。读取该文件后,它查找~/.bash_profile、~/.bash_login和~/.profile,按顺序读取并执行第一个存在且可读的文件。当启动shell时可以使用--noprofile选项以禁止这种行为。
当登录shell退出时,如果存在~/.bash_logout文件,则bash会读取并执行其中的命令。
当启动交互式shell而不是登录shell时,如果存在~/.bashrc文件,则bash会从中读取并执行命令。可以使用--norc选项禁止此操作。--rcfile文件选项将强制bash从文件中读取并执行命令,而不是从~/.bashrc中读取。当Bash非交互式地启动时,比如运行一个shell脚本,它会在环境变量中查找变量BASH_ENV的值,并扩展其值(如果在环境变量中存在),然后使用扩展后的值作为要读取和执行的文件名。 Bash的行为就像执行了以下命令:
`if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi`
但是不使用PATH变量来搜索文件名。
ssh user@host "bash --login -c 'command arg1 ...'"
将使远程shell设置登录环境。你引用的那段内容确实提到了--login
,但很容易被忽略。 - codebeardssh <ssh选项> <IP> bash --login my_script.sh
在远程机器上运行脚本,效果很好,并成功地使用了本地环境变量,如JAVA_HOME
。 - markc/etc/profile
中并不能起作用,但是将其添加到/etc/environment
中可以。 - R.Liu在运行命令之前先进行配置文件的资源引用怎么样?
ssh user@host "source /etc/profile; /path/script.sh"
你可能认为最好将其更改为~/.bash_profile
、~/.bashrc
或其他文件。
bashrc
或 bash_profile
脚本可能很困难。相反,让 bash
自己处理这个问题:
ssh user@host "bash --login -c 'command arg1 ...'"
- codebeard当远程运行ssh命令时,Shell环境不会加载。 您可以编辑ssh环境文件:
vi ~/.ssh/environment
它的格式是:
VAR1=VALUE1
VAR2=VALUE2
还要检查sshd
配置中的PermitUserEnvironment=yes
选项。
sshd
文件在哪里吗? - Tengerye我遇到了类似的问题,但最终我发现只需修改~/.bashrc文件即可解决问题。
然而,在Ubuntu中,我需要注释掉停止处理~/.bashrc的那一行:
#If not running interactively, don't do anything
[ -z "$PS1" ] && return
/etc/bash.bashrc
找到。 - adarshr只需在~/.bashrc中非交互式shell的检查之前导出您想要的环境变量即可。
bash
不是一种脚本语言? - Dan NissenbaumUsePAM no
。如果是这样,那么通常负责自动获取/etc/environment
的 "PAM configuration for sshd" (/etc/pam.d/sshd
) 将会失效。... 设置UsePAM yes
(并重新启动sshd
以应用此更改)现在应该为 ssh 登录 shell 提供来自/etc/environment
的export
。... 根据 https://man7.org/linux/man-pages/man5/sshd_config.5.html ->UsePAM
文档,根据您的需求,建议还设置以下内容:KbdInteractiveAuthentication no
和PasswordAuthentication no
。 - Abdull