`

SSH连接远程服务器直接执行command时PATH设置不全的一种解决方案

 
阅读更多

git作为DVCS的强大功能之一就是可以不用中心server节点,直接在developers之间的host同步源码。这个好处有很多,比如可以想到的一个比较明显的好处就是:可以在code尚未ready的情况下,随意在host之间同步,方便协作开发。(试想一下,如果是传统的CVCS,比如SVN,在代码尚未ready的时候,将代码就提交的中心repo,那简直就是噩梦。不幸的是,如果你如果不借助诸如rsync之类的外部工具,你几乎根本没办法绕开中心仓库,因为他是链接dev之间的一座桥)

今天折腾了一下在自己的desktop和laptop之间同步code的具体设置,没想到还真没那么顺利。

  • Desktop:git clone 了remote repo A, 并做了一些修改,但code尚未完全测试,不适合push回到remote repo。
  • Laptop:同样git clone 了remote repo A,这时希望获得desktop的所有修改,在Laptop上继续进行开发。于是执行了下面的命令:
    git remote add desktop user@desktop.domain:/desktop/repo/path/.git
    git checkout -b from-desktop # create a new branch to receive the modification from desktop
    git pull desktop from-desktop # fetch from the desktop and merge it to the branch from-desktop
    杯具的是执行最后一步时,爆出了git-upload-pack command not found这种错误。所以git pull也根本没有成功。

从提示上看是找不到git-upload-pack, 估计是PATH中没有git-upload-pack所在的路径。因为git是公司统一的标准安装路径,用which git-upload-pack 查看了一下,在一个特殊的路径/company/set/path下。

上面的git remote add命令中没有指定git使用的协议,默认使用的就是ssh了。这样分析说明问题出在ssh远程执行命令上了。

从Laptop ssh到desktop上执行echo $PATH, 发现PATH中正常包/company/set/path这个路径。

退出来之后,再通过ssh username@desktop.domain 'echo $PATH‘查看PATH变量,这时果然就不包括/company/set/path了。

 

问题基本上定位到了,就是因为这里的差异,但是为什么会有这样的差异呢?

在Desktop上的.bash_profile设置非常简单,就是下面这些,

       if [ -f $HOME/.profile ]; then
               . $HOME/.profile
       fi

       if [ -f $HOME/.bashrc ]; then
               . $HOME/.bashrc
       fi

 两者理论上都执行了这个配置文件,我的$HOME下只有.bashrc的配置(对PATH的若干设置和export就在.bashrc中,其中就包/company/set/path),所以两者应该走了同样的路径,没道理,一个路径中有,一个路径中没有啊。

 

找了半天,终于在.bashrc的第一行注意到这一句

# If not running interactively, don't do anything
[ -z "PS1" ] && return

 恍然大悟,罪魁祸首啊!

Linux系统中一种常用的判断是否是交互shell的方式就是通过PS1变量,虽然还有其他的方式,不过现在.bashrc中是通过PS1来判断是否为interactive mode。

通过ssh协议登陆到Desktop上时,已经在Laptop上开启了一个tty终端,属于interactive mode, 所以上面的那行不会进入return逻辑,整个.bashrc会被执行完,于是PATH中包括了所有设置过的关键路径。(N多export的PATH都放在了.bashrc的末尾)

但是ssh username@desktop.domain 'command'这种是典型的non-interactive shell,所以虽然也执行了.bashrc文件,但是在一开始就直接进入了return逻辑返回了,所以文件底部的对PATH的export根本没有生效。于是,就有了开始杯具。

 

找到根本问题了,解决方案就有了,将必要的export PATH的声明,全部移到[ -z "PS1" ] && return 之前。保证在non-interactive mode下,PATH的设置也都会生效。

 

再次从Laptop上执行git pull desktop from-desktop,所有修改被成功merge到Laptop的from-desktop分支上,问题解决!

 

分享到:
评论
1 楼 zqjer1 2016-12-20  
帮大忙了  

相关推荐

    [Mac]解决mac机器上没有ssh-copy-id的问题

    `ssh-copy-id`是SSH工具包的一部分,它简化了将公钥添加到远程服务器的授权钥匙链的过程,从而允许无密码登录。然而,有时在Mac上可能会遇到没有`ssh-copy-id`命令的问题。本文将深入探讨这个问题及其解决方案。 ...

    SSH经典实例 给力

    SSH,全称Secure Shell,是一种网络协议,用于在不安全的网络环境中提供安全的远程登录和其他服务。在IT行业中,SSH常被用作Linux或Unix系统中的管理员工具,用于远程控制服务器、传输文件以及执行命令等操作。SSH...

    Java实现Linux的远程拷贝

    JSch是Java的一个开源库,提供了SSH2协议的实现,允许我们通过SSH连接执行命令、传输文件等操作。在项目中引入JSch库后,我们就可以开始编写代码了。 1. **建立SSH连接** 在Java中,我们需要创建一个`JSch`实例,...

    用paramiko:ssh.exec_command怎样运行import命令

    `ssh.exec_command()`函数是`paramiko`库中的一个关键方法,它允许你通过SSH连接在远程服务器上执行命令。然而,如你所遇到的问题,直接使用`exec_command()`来运行包含`import`语句的Python脚本可能会遇到一些挑战...

    如何在windows环境下安装python的paramiko模块实现SSH远程登录到其他平台

    总的来说,使用Paramiko在Windows环境下进行SSH远程登录是一个涉及Python环境配置、模块安装和SSH连接的过程。遵循上述步骤,你应该能够顺利地实现对其他平台的远程操作。如果在使用过程中遇到问题,记得查看提供的...

    Python基于SSH协议实现Linux系统远程管理方法研究.zip

    SSH(Secure Shell)协议则是一种安全的网络协议,用于在不安全的网络上进行加密通信,特别是进行远程登录和其他命令执行操作。本篇文章将深入探讨如何利用Python通过SSH协议来实现对Linux系统的远程管理。 首先,...

    shell脚本执行jps时:-bash: jps: command not found

    1. **解决方案一**:在`ssh`命令后添加`source /etc/profile`来激活配置文件。这样做的好处是,它会使得远程服务器加载`/etc/profile`中的环境变量,包括`JAVA_HOME`,使得`jps`命令可以被找到。命令变为: ``` ...

    telnet不能用 提示:-bash: telnet: command not found

    在Linux系统中,"telnet不能用,提示:-bash: telnet: command not found"这一问题通常是由于系统中没有预装telnet客户端或者其路径未被添加到环境变量PATH中导致的。telnet是一个远程登录协议,允许用户通过网络在...

    paramiko-1.7.5.zip

    SSH 是一种网络协议,用于加密网络连接,确保数据传输的安全性。它通常用于远程登录服务器、执行命令、管理文件等。Paramiko 是 Python 社区广泛使用的 SSHv2 实现,提供了客户端和服务器端的功能。 在 Paramiko 中...

    sshkit.ex:Elixir工具箱,用于在一个或多个服务器上执行任务,基于Erlang的SSH应用程序构建

    SSHKit.ex是Elixir社区开发的一个强大的工具,它允许用户在一个或多个远程服务器上自动化执行任务。这个库基于Erlang的SSH应用程序,充分利用了Elixir的并发性和分布式特性,使得在多服务器环境中的运维工作变得更加...

    5个常见运维场景,用这几个Python脚本就够了!.docx

    无论是连接远程服务器、解析日志文件还是监控系统状态,Python都能提供高效、可靠的解决方案。同时,Python的强大之处还在于其丰富的第三方库支持,这使得开发人员能够快速构建出满足特定需求的脚本。在未来,随着...

    ipmitool v1.8.18 for windows.rar

    5. **远程控制**:配置好连接信息后,你可以使用`ipmitool -I lanplus -H <ip_address> -U <username> -P <password> <command>`这样的格式来远程执行各种IPMI操作。 6. **安全注意事项**:因为IPMITool可以对...

    python通过ssh-powershell监控windows的方法

    本文将详细介绍如何使用Python结合SSH协议,通过PowerShell远程监控Windows服务器,并提供实际代码示例,以便读者能够快速上手并应用到实际工作中。 #### SSH-PowerShell基础 SSH(Secure Shell)是一种加密的网络...

    python删除服务器文件代码示例

    无论是通过SSH远程删除文件,还是本地删除旧文件,Python都提供了一种简洁、有效的解决方案。对于有志于提升服务器管理效率的运维人员而言,这些知识点和技巧无疑是非常宝贵的。通过持续学习和实践,可以进一步深化...

    linux服务器的一些知识点.pdf

    - **社区支持**:拥有庞大的开发者和用户社区,能够提供丰富的技术支持和解决方案。 #### 2. 查看当前目录下的文件列表 **命令:** - `ls`:列出当前目录下的文件和目录,默认按字母顺序排序。 - `ls -l`:以长...

    使用Powershell在多线程中运行PSexec

    此外,必须要有适当的错误处理机制,因为当远程服务器未响应或命令执行失败时,需要捕获并处理这些异常。 6. **安全和权限**:在远程执行命令时,必须确保有足够的权限,并且遵循安全最佳实践,如使用安全的凭证...

    linux笔记

    - VMware: 提供稳定可靠的虚拟化解决方案,广泛应用于企业和教育领域。 - VirtualBox: 开源免费的虚拟机软件,适合个人和小型项目使用。 ##### 1.2 创建虚拟机 - **步骤**: 1. 安装虚拟化软件,如VMware ...

Global site tag (gtag.js) - Google Analytics