美文网首页
ssh远程连接服务器执行命令

ssh远程连接服务器执行命令

作者: Sealwk | 来源:发表于2018-09-03 20:17 被阅读925次

    问题

    首先说一下使用ssh远程连接服务器执行命令的方法:
    为了方便描述,这里把测试服务器称之为A1,目标服务器称之为A2

    • A1与A2之间首先要建立ssh免密登录,在A1上生成公钥和私钥

    ssh-keygen -t rsa -f id_rsa -P ''

    • 获取A1的公钥

    vim ~/.ssh/id_rsa.pub

    • 将A1的公钥拷贝到A2的authorized_keys文件中保存。注意一个公钥中间不能有空格或换行!
    • 在A1上验证免密登录是否配置成功

    ssh -p A2port A2user@A2ip

    如果可以直接登录到A2,则配置成功!


    image.png
    • 在A1远程连接A2执行命令

    ssh -p A2port A2user@A2ip "rm -fr test"

    下面来说问题:
    ssh在远程连接服务器执行命令的时候,经常会遇到环境变量的问题,如下:

    /data/resin-pro-4.0.49/bin/resin.sh: line 44: exec: java: not found

    如果出现上面的提示,则说明环境变量配置有问题。
    先来说解决办法

    解决

    • 访问A2上/etc/profile文件,拷贝文件中的环境变量,例如JAVA_HOME, PATH等等
    • 将环境变量拷贝至~/.bashrc文件保存

    source ~/.bashrc

    问题解决!

    原因及拓展

    这里就要说明bash有两种方式interactive + login shell模式和non-interactive + non-login shell模式
    在服务器上执行命令,走的是interactive + login shell模式,而通过远程登录执行命令,走的是non-interactive + non-login shell模式。
    这两种模式对于环境变量的读取是有区别的。

    • interactive + login shell模式

    Shell首先会加载/etc/profile文件,然后再尝试依次去加载下列三个配置文件之一,一旦找到其中一个便不再接着寻找:
    ~/.bash_profile
    ~/.bash_login
    ~/.profile

    • non-interactive + non-login shell模式
      它不会去执行/etc/profile文件,而会去用户的HOME目录检查.bashrc并加载

    所以当远程执行命令时,我们只需要让~/.bashrc文件中的环境变量与/etc/profile中的环境变量一致即可!

    参考:
    如何解决SSH远程执行命令找不到环境变量的问题

    相关文章

      网友评论

          本文标题:ssh远程连接服务器执行命令

          本文链接:https://www.haomeiwen.com/subject/prbiwftx.html