zoukankan      html  css  js  c++  java
  • linux 执行远程linux上的shell脚本或者命令以及scp 上传文件到ftp免密码登陆

    场景:在linux A 上执行Linux B上的shell脚本和命令

    步骤1.设置ssh免登陆

    1.SSH无密码登录

    # 本地服务器执行(A机器):生成密钥对

    ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa

    cp  ~/.ssh/id_dsa.pub authorized_keys

    如果有邮箱的话,使用

    ssh-keygen -t rsa -C test@163.com
    cat ~/.ssh/id_rsa.pub

    然后使用winscp或者fileziall之类的文件传输,将authorized_keys上传到B上

    # 远程服务器执行(B机器):用公钥给远程机器授权,首先需要将本地公钥拷贝到远程服务器上,远程机器授权全后,可以删除公钥

    cat authorized_keys >> ~/.ssh/authorized_keys

    操作完以后,A机器就可以无密码SSH到B机器上了

    步骤2.执行具体命令

    ssh root@192.168.56.2 "sh /root/test.sh"

    另外免密码登陆还有以下两种方式:

    方法1:sshpass

    (1)安装sshpass:

    unbuntu系统:apt-get  install sshpass

    centos系统:  

      方法1:

      cd mytools_tmp/

      wget http://download.opensuse.org/repositories/home:Strahlex/CentOS_CentOS-6/home:Strahlex.repo  

      yum install sshpass  

    或者方法2:curl -O -L http://downloads.sourceforge.net/project/sshpass/sshpass/1.05/sshpass-1.05.tar.gz && tar xvzf sshpass-1.05.tar.gz && cd sshpass-1.05 && ./configure && make && sudo make install

    或者方法3:

    wget http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

    rpm -ivh epel-release-6-8.noarch.rpm

    yum --enablerepo=epel -y install sshpass

    mac 系统:

      brew install https://raw.github.com/eugeneoden/homebrew/eca9de1/Library/Formula/sshpass.rb 

    (2)使用sshpass 和scp复制文件到ftp,比如ftp的用户名为test,密码123456

    sshpass -p "123456" scp -v files.zip $ftp_server/$ftp_pass

    此处需要说到一点,一个我遇到的问题:我在jenkins slave的mac机器上安装了sshpass,在mac机上执行sshpass 和scp传文件是没有问题的,但是我在jenkins master的centos系统上,调用位于jenkins slave机器上(Mac机)的sshpass就会提示命令找不到 !!!!     如何解决这个问题呢? 方法是:在jenkins slave 的mac机器上使用which sshpass查找sshpass命令的路径,比如我的显示的是/usr/local/bin/sshpass, 那么调用时直接写这个路径(换句话,就是设置到环境变量中,调用时提前执行source 环境变量文件)

    方法2:使用expect 脚本来自动输入密码

    该方式主要是为了截获界面输出,expect用于自动化地执行linux环境下的命令行交互任务,例如scp、ssh之类需要用户手动输入密码然后确认的任务。有了这个工具,定义在scp过程中可能遇到的情况,然后编写相应的处理语句,就可以自动地完成scp操作了。

    (1)设置脚本expect_scp脚本,传入参数包含:主机 用户名 密码 源文件路径 目的文件路径

    #!/usr/bin/expect  

    set timeout 10  

    set host [lindex $argv 0]  

    set username [lindex $argv 1]  

    set password [lindex $argv 2]  

    set src_file [lindex $argv 3]  

    set dest_file [lindex $argv 4]  

    spawn scp $src_file $username@$host:$dest_file  

     expect {  

     "(yes/no)?"  

      {  

       send "yes\n"  

      expect "*assword:" { send "$password\n"}  

      }  

     "*assword:"  

      {  

        send "$password\n"  

      }  

    }  

    expect "100%"  

    expect eof 

    备注:以上脚本第一行,指定了expect的路径,与shell脚本相同,这一句指定了程序在执行时到哪里去寻找相应的启动程序。

    如果将以上脚本保存为expect_scp文件,则在shell下执行时需要按以下的规范来输入命令:

    ./expect_scp 192.168.75.130 root 123456 /root/src_file  /root/dest_file

    出错解析

    (1)如果出现了报错:

      /usr/bin/expect: bad interpreter: No such file or directory

      原因时没有安装expect,解决办法如下:
      yum install tcl-devel
      yum install expect
    (2)但是按照上面的脚本,会出现上传文件大小不一致的问题,
      解决方法:
    set timeout -1
    参考:https://blog.csdn.net/ashic/article/details/46914589

    备注:以上过程第一次的时候上传文件会上传不上,那是因为没有确认永久添加主机,第一次,先执行下ssh $user@$host,看到询问是否永久添加主机,输入yes,以后就不需要了,

     

    参考:http://blog.csdn.net/nfer_zhuang/article/details/42646849

    结束!

     

  • 相关阅读:
    pb数据窗口下拉数据窗口列的排序(翻译)
    pb重复行的检查(翻译)
    pb数据窗口如何按当前列的值过滤下拉数据窗口(翻译)
    PB中通过对象名获取对象并获取对象下的子对象
    有关医嘱中的bid,qd等执行频率
    pb数据窗口新增的列编辑后不会分行
    words
    here.less
    Springboot use tomcat JNDI
    genemotion
  • 原文地址:https://www.cnblogs.com/zndxall/p/8059033.html
Copyright © 2011-2022 走看看