解决SSH远程执行命令找不到环境变量的问题

通过SSH执行远程主机的命令或脚本时,经常会出现找不到自定义环境变量的问题。但是,如果通过SSH登录远程主机,然后再执行相同的命令或脚本,那么此时执行又是成功的。两种相似的方法,得到的结果却截然不同,看起来很诡异的现象,根本原因在于这两种方式使用的bash模式不同!

1. 通过SSH登录后再执行命令和脚本
这种方式会使用Bash的interactive + login shell模式,这里面有两个概念需要解释:interactive和login。

login故名思义,即登陆,login shell是指用户以非图形化界面或者以ssh登陆到机器上时获得的第一个shell,简单些说就是需要输入用户名和密码的shell。因此通常不管以何种方式登陆机器后用户获得的第一个shell就是login shell。

interactive意为交互式,这也很好理解,interactive shell会有一个输入提示符,并且它的标准输入、输出和错误输出都会显示在控制台上。所以一般来说只要是需要用户交互的,即一个命令一个命令的输入的shell都是interactive shell。而如果无需用户交互,它便是non-interactive shell。通常来说如bash script.sh此类执行脚本的命令就会启动一个non-interactive shell,它不需要与用户进行交互,执行完后它便会退出创建的Shell。

在interactive + login shell模式中,Shell首先会加载/etc/profile文件,然后再尝试依次去加载下列三个配置文件之一,一旦找到其中一个便不再接着寻找:

~/.bash_profile
~/.bash_login
~/.profile
2. 通过SSH直接执行远程命令和脚本
这种方式会使用Bash的non-interactive + non-login shell模式,它会创建一个shell,执行完脚本之后便退出,不再需要与用户交互。

no-login shell,顾名思义就是不是在登录Linux系统时启动的(比如你在命令行提示符上输入bash启动)。它不会去执行/etc/profile文件,而会去用户的HOME目录检查.bashrc并加载。

系统执行Shell脚本的时候,就是属于这种non-interactive shell。Bash通过BASH_ENV环境变量来记录要加载的文件,默认情况下这个环境变量并没有设置。如果有指定文件,那么Shell会先去加载这个文件里面的内容,然后再开始执行Shell脚本。

3. 结论
由此可见,如果要解决SSH远程执行命令时找不到自定义环境变量的问题,那么可以在登录用户的HOME目录的.bashrc中添加需要的环境变量。

4、示例
当登录之后,直接在某台远程主机:10.0.63.9上执行日期格式化的命令时,打印的是正确的,如下:

[root@dev-appserver2 ~]# buildTimeStamp=2017-09-27T16:58:47.291+08:00; buildTimeStampStr=$(date -d $buildTimeStamp "+%y%m%d%H%M%S"); echo $buildTimeStampStr
170927165847
当在另外一台主机(10.0.251.216)上远程执行ssh命令时,打印的结果不正确(差了八个时区),如下:

[root@host-10-0-251-216 ~]# cat sshtime
buildTimeStamp=2017-09-27T16:58:47.291+08:00; buildTimeStampStr=$(date -d $buildTimeStamp "+%y%m%d%H%M%S"); echo $buildTimeStampStr

[root@host-10-0-251-216 ~]# a=`cat sshtime `
[root@host-10-0-251-216 ~]# echo $a
buildTimeStamp=2017-09-27T16:58:47.291+08:00; buildTimeStampStr=$(date -d $buildTimeStamp "+%y%m%d%H%M%S"); echo $buildTimeStampStr
[root@host-10-0-251-216 ~]# ssh root@10.0.63.9 $a
root@10.0.63.9's password:
170927085847


此时修改10.0.63.9上,root根目录下的.bashrc文件,增加TZ的设置,再次执行ssh打印的结果是正确的:

[root@dev-appserver2 ~]# cat .bashrc
# .bashrc
 
# User specific aliases and functions
 
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
 
export TZ="Asia/Shanghai"
 
# Source global definitions
if [ -f /etc/bashrc ]; then
    . /etc/bashrc
fi
[root@dev-appserver2 ~]#


[root@host-10-0-251-216 ~]# ssh root@10.0.63.9 $a
root@10.0.63.9's password:
170927165847
--------------------- 
作者:sunxiaopengsun 
来源:CSDN 
原文:https://blog.csdn.net/sunxiaopengsun/article/details/82461338 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Win7的命令行上使用ssh命令提示"ssh不是内部命令"可能是因为该命令没有在系统的环境变量中被识别和添加。在Win7系统上,ssh命令默认是不包含在Windows的命令集中的,所以需要手动添加才能顺利使用。 要解决这个问题,可以按照以下步骤进行操作: 1. 确保你的系统中已经正确安装了ssh客户端,如OpenSSH。 2. 打开控制面板,然后点击“系统与安全”。 3. 在新窗口中,点击“系统”。 4. 在左侧导航栏中,点击“高级系统设置”。 5. 在弹出的系统属性窗口中,点击“环境变量”按钮。 6. 在下方的“系统变量”部分,到名为“Path”的变量,并点击“编辑”。 7. 在编辑系统变量窗口中,点击“新建”,然后输入ssh的安装路径,例如C:\Program Files\OpenSSH。 8. 确认所有更改并关闭所有弹窗。 9. 重新启动命令行窗口(如果已经打开的话),然后尝试使用ssh命令进行连接。 完成上述步骤后,ssh命令应该就可以在Win7的命令行中正常使用了。如果问题仍然存在,可以检查ssh的安装路径是否正确,或者尝试重新安装ssh客户端。 ### 回答2: win7中没有自带的SSH命令,因此当我们在命令提示符中输入“ssh”时,系统会提示“ssh不是内部命令,也不是外部命令,也不是可运行的程序或批处理文件”。 SSH(Secure Shell)是一种网络协议,用于在不安全的网络中提供安全的远程登录和执行命令。但在Windows系统中,它并不是默认安装的组件。 要使用SSH功能,我们需要从第三方提供的软件中选择安装并配置。比如,在Windows系统中,我们可以安装OpenSSH或PuTTY等软件来提供SSH功能。 安装OpenSSH的具体步骤如下: 1. 打开控制面板,在“程序”或“程序和功能”(视Windows版本而定)下到“启用或关闭Windows功能”。 2. 在打开的窗口中,到“OpenSSH客户端”和“OpenSSH服务器”复选框,勾选它们。 3. 点击“确定”保存更改。 4. 系统会开始安装并配置OpenSSH组件。 安装PuTTY的具体步骤如下: 1. 打开Web浏览器,搜索并下载PuTTY软件。 2. 安装PuTTY软件,根据安装向导的提示完成安装过程。 3. 安装完成后,打开PuTTY并输入目标主机的IP地址或主机名。 4. 选择SSH协议,并确保端口号设置为22(默认端口号)。 5. 点击“连接”按钮,进行远程连接。 除了以上提到的这两种软件,还有其他类似的SSH软件可供选择,具体安装和使用步骤可能会有所差异。 总结起来,当在Windows 7系统中运行SSH命令时会提示“ssh不是内部命令”,是因为系统没有自带SSH组件。我们需要通过安装第三方软件(如OpenSSH或PuTTY)来实现SSH功能并进行远程连接。 ### 回答3: "win7 ssh不是内部命令"的错误提示很可能是因为Windows 7操作系统没有内置SSH命令。SSH是一种安全的远程管理协议,它允许用户远程登录到其他主机并执行命令。 在Windows 7中,要使用SSH命令,您需要安装第三方的SSH客户端软件,例如PuTTY等。PuTTY是一个广泛使用的SSH、Telnet和串口连接软件,它可以在Windows系统上使用。 要安装PuTTY,您可以按照以下步骤进行操作: 1. 打开您的Web浏览器,然后在搜索引擎中搜索“PuTTY下载”。 2. 从官方网站或其他可信渠道下载PuTTY安装程序。 3. 运行下载的安装程序,并按照提示完成安装过程。 4. 完成安装后,您会在桌面或开始菜单中到PuTTY应用程序。 5. 双击PuTTY应用程序图标打开它。 6. 在PuTTY窗口中,输入您要远程连接的主机的IP地址或域名,并选择SSH作为连接类型。 7. 点击“打开”按钮,PuTTY将会尝试连接到指定的主机。 8. 如果连接成功,您将被要求输入用户名和密码登录到目标主机。 通过上述步骤,您可以在Windows 7上安装和使用SSH客户端软件来远程连接其他主机进行管理和操作。请注意,您可能需要有相应主机的远程访问权限和凭据才能成功连接。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值