SCP和SFTP不用输入密码的信任公钥方法攻略

3 篇文章 0 订阅
1 篇文章 0 订阅

总结一下可以避免sftp输入密码的三种方式:

第一种:最常用

大多对密级要求较高的企业单位都使用SFTP方式传输,但是SFTP传输必须输入密码,对于通过脚本定时传输文件非常不方便。

信任公钥(对称公钥)方法解决了每次都输入密码的问题:使用客户端生成密钥钥对,将公钥添加到服务器的信任公钥表中,即完成了服务器对客户端信任的添加,再次使用SCP或者SFTP则不需要密码。


SCP和SFTP不用输入密码的信任公钥方法攻略

工具/原料

  • 两台HP Unix服务器

  • SecureCRT

基础知识普及

  1. sftp是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的加密方法。sftp 与 ftp 有着几乎一样的语法和功能。SFTP 为 SSH的一部份,是一种传输档案至 Blogger 伺服器的安全方式。其实在SSH软件包中,已经包含了一个叫作SFTP(Secure File TransferProtocol)的安全文件传输子系统,SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接操作,所以从某种意义上来说,SFTP并不像一个服务器程序,而更像是一个客户端程序。SFTP同样是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP。

客户端生成密钥对,分发公钥

  1. 进入系统家目录

    首先需要在家目录创建.ssh文件夹

    # ll –a     查看隐藏目录,默认此目录里如果没有.ssh隐藏目录,则需要手动创建

    # mkdir .ssh 新建.ssh文件夹

    SCP和SFTP不用输入密码的信任公钥方法攻略
  2. #cd .ssh             进入.ssh目录

    #ssh-keygen -t rsa   执行创建密钥对命令

    Generating public/private rsa key pair.

    Please be patient....   Key generation may take a few minutes

    Enter file in which to save the key (/home/ap/appnms/.ssh/id_rsa):

    # 按回车保存为: //.ssh/id_rsa,即当前用户的私钥

    Enter passphrase (empty for no passphrase):

    # 按回车,表示读取密钥时不需要密钥的密码

    Enter same passphrase again:

    # 确认密钥的密码,必须和上面的输入相同

    Your identification has been saved in /home/ap/appnms/.ssh/id_rsa.

    # 私钥保存信息

    Your public key has been saved in /home/ap/appnms/.ssh/id_rsa.pub.

    # 公钥保存信息

    The key fingerprint is:

    31:03:78:64:4f:8e:9d:a9:31:bf:38:5d:1a:79:08:e6 appnms@T254N0V4

    # 密钥指纹

    The key's randomart image is:

    +--[ RSA 2048]----+

    |     o+ .        |

    |    ...B o       |

    |     .* X        |

    |     o * *       |

    |      E S o      |

    |       o *       |

    |      o +        |

    |       .         |

    |                 |

    +-----------------+

    SCP和SFTP不用输入密码的信任公钥方法攻略
  3. 把.ssh目录下的公钥文件:/当前用户home目录/.ssh/id_rsa.pub文件传输到服务器上。

    #scp/home/ap/appnms/.ssh/id_rsa.pub appmon@128.192.141.129:/ultranms/appmon/.ssh

    此时仍需要输入密码,革命即将成功:)

    SCP和SFTP不用输入密码的信任公钥方法攻略

服务器端添加信任公钥

  1. 登录服务器查看用户家目录:

    #cat /etc/passwd | grep appmon

    appmon:tAceUEMuTYB9Q:116:20::/ultranms/appmon:/sbin/sh

    通过检查home目录为/ultranms/appmon  家目录的权限必须是755


    SCP和SFTP不用输入密码的信任公钥方法攻略
  2. # cd /.ssh                      进入到.ssh目录  .ssh目录权限必须是755或者700

    # cp id_rsa.pub authorized_keys 第一次添加时将公钥重命名为authorized_keys

    # chmod 644 authorized_keys     公钥文件的权限必须是644


    如果有多个客户端,依次将客户端公钥附加到服务器的authorized_keys文件内即可。

    # cat /tmp/id_rsa.pub >> authorized_keys


    SCP和SFTP不用输入密码的信任公钥方法攻略

测试传输

  1. 使用sftp访问测试是否配置成功,成功的现象是访问不需要输入密码-_—

    #sftp appmon@128.192.141.129  

    如果不需要输入密码则公钥设置成功

    只有第一次连接需要输入YES确认:

    The authenticity of host '128.192.141.129 (128.192.141.129)' can't be established.

    RSA key fingerprint is 91:b8:8e:85:8a:33:da:6e:04:a0:96:4d:9a:bb:57:67.

    Are you sure you want to continue connecting (yes/no)? yes

    Warning: Permanently added '128.192.141.129' (RSA) to the list of known hosts.

    Connected to 128.192.141.129.。

    SFTP测试成功了,下面测试一下文件传输

  2. # scp /需要上传源文件的绝对路径 目的用户名@IP地址:目的目录

    示例:#

    scp /home/ap/appnms/.ssh/id_rsa.pub appmon@128.192.141.129:/ultranms/appmon/.ssh

    id_rsa.pub                          100%  397   0.4KB/s   0.4KB/s   00:00

    大功告成!

    SCP和SFTP不用输入密码的信任公钥方法攻略

客户端脚本与crontab

  1. 写个简单的脚本示例:

    test.sh

    #/bin/sh

    scp /home/ap/appnms/.ssh/id_rsa.pub appmon@128.192.141.129:/ultranms/appmon/.ssh


  2. #crontab –e  /注:客户端根据实际情况修改crontab自动调用脚本。

注意事项

  • 权限:如果配置完对等信任公钥,仍提示输入密码或者访问拒绝,则需要查看服务器的目录权限是否正确,家目录权限755,.ssh目录权限是755,authorized_keys文件权限是644

  • 备份:authorized_keys不能出现空格等不是公钥的信息,否则公钥文件就会失效,每次附加新公钥时,养成变更前备份的好习惯


    第二种

    lftp方式

    LFTP是一款非常著名的字符界面的文件传输工具。支持FTP、HTTP、FISH、SFTP、HTTPS和FTPS协议。
    例子:(本例为下载例子)

     

    [plain]  view plain copy
    1. #!/bin/sh   
    2. HOST=172.16.2.X  
    3. USER=kg_sftp    
    4. PASS=tnzk4a7w    
    5. echo "Starting to sftp..."  
    6. lftp -u ${USER},${PASS} sftp://${HOST} <<EOF   
    7. cd /kagou/datafile    
    8. mget *.*    
    9. bye    
    10. EOF    
    11. echo "done"  

     

    第三种

    expect方式

    Expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。

    要使用expect需要预先安装tcl这个东西,然后再安装expect包。

    tcl:     http://prdownloads.sourceforge.net/tcl/tcl8.4.16-src.tar.gz

    expect:     http://sourceforge.net/projects/expect/files/Expect/5.45/expect5.45.tar.gz/download

    例子:


    [plain]  view plain copy
    1. #!/usr/local/bin/expect -f    
    2. #<---insert here your expect program location  
    3. #procedure to attempt connecting; result 0 if OK, 1 elsewhere  
    4.  proc connect {passw} {  
    5.   expect {  
    6.     "(yes/no)?" {send "yes/r";exp_continue} #第一次使用SFTP时候会要求输入yes/no   
    7.     "password:" {send "$passw/r"            #自动输入密码  
    8.   expect {  
    9.      "sftp*" {        #检测返回sftp>  
    10.    return 0  
    11.       }    
    12.   }  
    13.      }  
    14.   }  
    15.   # timed out  
    16.   return 1  
    17.  }  
    18.    
    19.  #read the input parameters  
    20.  set user [lindex $argv 0]  
    21.  set passw [lindex $argv 1]  
    22.  set host [lindex $argv 2]  
    23.  set location [lindex $argv 3]  
    24.  set file1 [lindex $argv 4]  
    25.    
    26.  #puts "Am citit:/n";  
    27.  #puts "user: $user";  
    28.  #puts "passw: $passw";  
    29.  #puts "host: $host";  
    30.  #puts "location: $location";  
    31.  #puts "file1: $file1";  
    32.   
    33.    
    34.  #check if all were provided  
    35.  if { $user == "" || $passw == "" || $host == "" || $location == "" || $file1 == "" }  {  
    36.    puts "Usage: <user> <passw> <host> <location> <file1 to send>/n"  
    37.    exit 1  
    38.  }  
    39.    
    40.  #sftp to specified host and send the files  
    41.  spawn sftp $user@$host  
    42.    
    43.  set rez [connect $passw]  
    44.  if { $rez == 0 } {  
    45.    send "cd $location/r"  
    46.    set timeout -1  
    47.    send "put $file1/r"  
    48.    #send "ls -l/r"  
    49.    #send "quit/r"  
    50.    #send "mkdir testsftp/r"  
    51.    send "quit/r"  
    52.    expect eof  
    53.    exit 0  
    54.  }  
    55.  puts "/nCMD_ERR: connecting to server: $host!/n"  
    56.  exit 1  
    57.  0  

    expect也可以用两种形式调用

    1   ./my.exp $usr $pwd $host $local $file

    2. 代码中直接插入 

    expect<<!




  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值