SSH远程连接时环境变量问题
2023-09-14 08:56:52 时间
1. 问题
invoke ~/.bash_profile /usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/user01/bin
invoke ~/.bash_profile /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
RHEL服务器A有个启动脚本(普通用户user01运行),里面使用ifconfig获取ip地址如下:
Localhost_ip=$(ifconfig |awk -F addr:|Bcast /Bcast/{print $2})
由于普通用户user01不能直接识别ifconfig命令,只能使用全路径/sbin/ifconfig,目前处理方式为修改~/.bash_profile文件添加环境变量如下:
PATH=$PATH:$HOME/bin
改成如下:
PATH=$PATH:$HOME/bin:/sbin
经过如上配置后服务器本机user01用户登录执行XX.sh脚本可以识别ifconfig命令。
出现如下问题:
远程主机B通过ssh远程执行启动脚本XX.sh,报错如下:
bash: ifconfg: command not found2. 问题分析
测试前准备,追加调用说明语句,如下:
/etc/profile [root@node3 ~]# vim /etc/profile echo "/etc/profile begin:" echo "$PATH" unset i unset pathmunge echo "invoke /etc/profile" echo "$PATH" echo ""
[root@node3 ~]# vim /etc/bashrc # vim:ts=4:sw=4 echo "invoke /etc/bashrc" echo "$PATH" echo ""
[root@node3 ~]# vim /root/.bash_profile # User specific environment and startup programs PATH=$PATH:$HOME/bin export PATH echo "invoke ~/.bash_profile" echo "$PATH" echo ""
[root@node3 ~]# vim /root/.bashrc # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc echo "invoke ~/.bashrc" echo "$PATH" echo ""
[root@node3 ~]# vim /home/user01/.bash_profile # User specific environment and startup programs PATH=$PATH:$HOME/bin export PATH echo "invoke ~/.bashrc" echo "$PATH" echo ""
[root@node3 ~]# vim /home/user01/.bashrc # User specific aliases and functions echo "invoke ~/.bashrc" echo "$PATH" echo ""
分 user 和 root 用户,3 种场景进行测试,如下:
普通用户 User本机使用 su 命令切换到普通用户 (属于 Login 方式)
结论:
Login 之前,系统 PATH 为:/usr/local/bin:/bin:/usr/bin Login 方式,文件调用顺序为: /etc/profile - /etc/bashrc - ~/.bashrc - ~/.bash_profile Login 之后,系统 PATH 为:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/user01/bininvoke ~/.bash_profile /usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/user01/bin
远程机使用 ssh 命令以普通用户身份登陆到主机 (属于 Login 方式)
结论:
与在本机使用 su 命令切换到普通用户的效果完全一样!ssh user@remote_server_ip [root@node1 ~]# hostname -i 192.168.122.31
[root@node1 ~]# ssh user01@192.168.122.33 user01@192.168.122.33s password: Last login: Tue Jul 9 16:23:33 2013 from 192.168.122.31 /etc/profile begin: /usr/local/bin:/bin:/usr/bin invoke /etc/profile /usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin invoke /etc/bashrc /usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin invoke ~/.bashrc /usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin invoke ~/.bash_profile /usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/user01/bin
远程机使用 ssh 命令以普通用户身份连接到主机执行获取 PATH 的命令 (属于 NoLogin 方式)
结论:
NoLogin 方式,命令获取的 PATH 为该远程机的,并未拿到目标主机的 PATH NoLogin 方式,文件调用顺序为:/etc/bashrc - ~/.bashrc NoLogin 方式,目标主机 User 用户 PATH 为:/usr/local/bin:/bin:/usr/bin[root@node1 ~]# echo $PATH /usr/local/rabbitmq/sbin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin [root@node1 ~]# ssh user01@192.168.122.33 "echo $PATH" user01@192.168.122.33s password: invoke /etc/bashrc /usr/local/bin:/bin:/usr/bin invoke ~/.bashrc /usr/local/bin:/bin:/usr/bin /usr/local/rabbitmq/sbin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin对比 root 用户
本机使用 su 命令切换到 root (属于 Login 方式)
结论:
Login 之前,系统 PATH 为:/usr/local/bin:/bin:/usr/bin Login 方式,root 用户,文件调用顺序为:/etc/profile - /etc/bashrc - ~/.bashrc - ~/.bash_profile Login 之后,系统 PATH 为:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bininvoke ~/.bash_profile /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
远程机使用 ssh 命令以 root 用户身份登陆到主机 (属于 Login 方式)
结论:
与在本机使用 su 命令切换到 root 用户的效果完全一样!ssh root@remote_server_ip [root@node1 ~]# hostname -i 192.168.122.31
[root@node1 ~]# ssh root@192.168.122.33 root@192.168.122.33s password: Last login: Tue Jul 9 15:54:53 2013 from 192.168.122.1 /etc/profile begin: /usr/local/bin:/bin:/usr/bin invoke /etc/profile /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin invoke /etc/bashrc /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin invoke ~/.bashrc /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin invoke ~/.bash_profile /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
远程机使用 ssh 命令以 root 用户身份连接到主机执行获取 PATH 的命令 (属于 NoLogin 方式)
结论:
NoLogin 方式,命令获取的 PATH 为该远程机的,并未拿到目标主机的 PATH NoLogin 方式,文件调用顺序为:/etc/bashrc - ~/.bashrc NoLogin 方式,目标主机 root 用户 PATH 为:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin[root@node1 ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin [root@node1 ~]# ssh root@192.168.122.33 "echo $PATH" root@192.168.122.33s password: invoke /etc/bashrc /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin invoke ~/.bashrc /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin关于/etc/profile 文件部分代码分析
结论:
无论 root 还是 user ,只有调用此文件,其 PATH 中才会被追加 sbin 相关路径。而由以上测试场景可知,只有 Login 时,/etc/profile 文件才会被调用。pathmunge () { case ":${PATH}:" in *:"$1":*) if [ "$2" = "after" ] ; then PATH=$PATH:$1 else PATH=$1:$PATH esac if [ -x /usr/bin/id ]; then if [ -z "$EUID" ]; then # ksh workaround EUID=`id -u` UID=`id -ru` USER="`id -un`" LOGNAME=$USER MAIL="/var/spool/mail/$USER"
3. 总结综上,如需修改 PATH,建议修改 bashrc 文件,从而保证任何方式访问时 PATH 的正确性。
PUTTY-0.75 下载安装及SSH远程连接方法 Putty是一个免费的、Windows 平台下的ssh远程登录工具。完全免费、小巧绿色、无需安装、操作简单,用它来远程管理Linux十分好用
雨客 微博@JavaChen,这里的所有博客文章来自http://blog.javachen.com/。
相关文章
- Linux修改SSH端口
- ssh(Spring+Spring mvc+hibernate)——EmpServiceImpl.java
- Linux SSH登录慢案例分析
- SSH连接linux时,长时间不操作就断开的解决方案
- python通过socket实现多个连接并实现ssh功能详解
- 大叔经验分享(121)ssh保持连接
- linux中解决SSH连接慢问题 关键点GSSAPIAuthentication
- ROS轻松帮你在ECS之间传递SSH Key
- 【SSH网上商城项目实战11】查询和删除商品功能的实现
- Linux远程连接ssh工具(FinalShell)xshell替代神器
- 使用ssh连接WSL
- SSH 协议的 ssh StrictHostKeyChecking
- 一步步使SSH连接您的github仓库
- windows10使用多套public key pair进行SSH连接github的配置文件
- 介绍3种ssh远程连接的方式
- SSH常用命令选项
- ssh配置连接
- ssh隧道常用命令
- ubuntu 16.04.7 LTS 开启ssh默认关闭ROOT账户远程密码连接
- windows 安装 ssh
- 内网穿透 frp、ssh远程访问内网、VNC远程桌面控制、macOS、ubuntu、kali
- Google Cloud Platform 谷歌云实例 MacOS SSH 连接
- Windows利用SSH - X远程登录Linux主机(X11-forwarding)
- Linux中实现SSH免密登录
- RHEL7连接ssh慢