最近编程中用到sftp上传文件,且需要用crontab预设定时上传事件。而sftp不同于ftp,没有提供选项如 -i 可以将密码直接编码进程序。使用sftp指令,会自动请求用户输入密码。

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

1. lftp方式

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

#!/bin/sh 

HOST=192.168.107.132
USER=huangmr
PASS=huangmr
echo "Starting to sftp..."
lftp -u ${USER},${PASS} sftp://${HOST}:22 <<EOF
cd /home/huangmr
mget *.*
bye
EOF echo "done"

2. 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. #read the input parameters
  19. set user [lindex $argv 0]
  20. set passw [lindex $argv 1]
  21. set host [lindex $argv 2]
  22. set location [lindex $argv 3]
  23. set file1 [lindex $argv 4]
  24. #puts "Am citit:/n";
  25. #puts "user: $user";
  26. #puts "passw: $passw";
  27. #puts "host: $host";
  28. #puts "location: $location";
  29. #puts "file1: $file1";
  30. #check if all were provided
  31. if { $user == "" || $passw == "" || $host == "" || $location == "" || $file1 == "" }  {
  32. puts "Usage: <user> <passw> <host> <location> <file1 to send>/n"
  33. exit 1
  34. }
  35. #sftp to specified host and send the files
  36. spawn sftp $user@$host
  37. set rez [connect $passw]
  38. if { $rez == 0 } {
  39. send "cd $location/r"
  40. set timeout -1
  41. send "put $file1/r"
  42. #send "ls -l/r"
  43. #send "quit/r"
  44. #send "mkdir testsftp/r"
  45. send "quit/r"
  46. expect eof
  47. exit 0
  48. }
  49. puts "/nCMD_ERR: connecting to server: $host!/n"
  50. exit 1
  51. 0

expect也可以用两种形式调用

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

2. 代码中直接插入

expect<<!

...

!

3. (推荐)生成密钥对

因为这种方式不用把密钥卸载程序里,所以更安全

第一步:生成密匙对,我用的是rsa的密钥。使用命令 "ssh-keygen -t rsa"
   [user1@rh user1]$ ssh-keygen -t rsa
   Generating public/private rsa key pair.
   Enter file in which to save the key (/home/user1/.ssh/id_rsa):
   Created directory '/home/user1/.ssh'.
   Enter passphrase (empty for no passphrase):
   Enter same passphrase again:
   Your identification has been saved in /home/user1/.ssh/id_rsa.
   Your public key has been saved in /home/user1/.ssh/id_rsa.pub.
   The key fingerprint is:
   e0:f0:3b:d3:0a:3d:da:42:01:6a:61:2f:6c:a0:c6:e7user1@rh.test.com
   [user1@rh user1]$


生成的过程中提示输入密钥对保存位置,直接回车,接受默认值就行了。接着会提示输入一个不同于你的password的密码,直接回车,让它空着。

当然,也可以输入一个。(我比较懒,不想每次都要输入密码。) 这样,密钥对就生成完了。


其中公共密钥保存在 ~/.ssh/id_rsa.pub

私有密钥保存在 ~/.ssh/id_rsa
然后改一下 .ssh 目录的权限,使用命令 "chmod 755 ~/.ssh"

   [user1@rh user1]$ chmod 755 ~/.ssh
 
之后把这个密钥对中的公共密钥复制到你要访问的机器上去,并保存为
   ~/.ssh/authorized_keys
   [user1@rh user1]$ scp ~/.ssh/id_rsa.pub rh1:/home/user1/.ssh/authorized_keys 

   

   user1@rh1's password:
   id_rsa.pub                                    100%  228     3.2MB/s   00:00
   [user1@rh user1]$


之这样就大功告成了。之后再用ssh scp sftp 之类的访问那台机器时,就不用输入密码

了,用在script上更是方便。

三种Shell脚本编程中避免SFTP输入密码的方法的更多相关文章

  1. 拾遗:Perl 在 Shell 脚本编程中的应用

    Perl 对我用途,仅是作为 Shell 脚本中的文本处理器:在较大的软件工程里,更多的是使用 C.go 等编译型语言. Perl 是一种历史比较悠久的动态编程语言,在各种类 Unix 系统中得到了应 ...

  2. Shell脚本编程中的几个问题

    条件语句 正确的写法: if [ $1 = "-f" ] #注意这里,前后方括号和中间的内容之间必须有空格! then commands fi 错误的写法: if [$1 == & ...

  3. Shell脚本编程中截取字符串方法

    例如: 假设变量var=http://www.baidu.com/111.png 1.#号截取(删左留右) echo ${var#*//} # 号是运算符,*// 表示从左边开始删除第一个 // 号及 ...

  4. [linux] shell脚本编程-xunsearch安装脚本学习

    安装脚本setup.sh #!/bin/sh # FULL fast install/upgrade script # See help message via `--help' # $Id$ # s ...

  5. centos shell脚本编程2 if 判断 case判断 shell脚本中的循环 for while shell中的函数 break continue test 命令 第三十六节课

    centos  shell脚本编程2 if 判断  case判断   shell脚本中的循环  for   while   shell中的函数  break  continue  test 命令   ...

  6. centos shell脚本编程1 正则 shell脚本结构 read命令 date命令的用法 shell中的逻辑判断 if 判断文件、目录属性 shell数组简单用法 $( ) 和${ } 和$(( )) 与 sh -n sh -x sh -v 第三十五节课

    centos   shell脚本编程1 正则  shell脚本结构  read命令  date命令的用法  shell中的逻辑判断  if 判断文件.目录属性  shell数组简单用法 $( ) 和$ ...

  7. Linux shell脚本编程(三)

    Linux shell脚本编程 流程控制: 循环语句:for,while,until while循环: while CONDITION; do 循环体 done 进入条件:当CONDITION为“真” ...

  8. 好记性比如烂笔头--linux学习笔记7关于linux中的shell脚本编程

    之前看的各种面试,貌似都有shell脚本编程,没了解之前感觉很复杂,现在了解了些,没想象中那么难. 逻辑主要是这样的 编写.sh的脚本文件,文件里面的代码,就是在命令行输入的可执行命令的加强版,所谓加 ...

  9. Linux shell脚本编程(二)

    Linux shell脚本编程(二) 练习:求100以内所有偶数之和; 使用至少三种方法实现; 示例1: #!/bin/bash # declare -i sum=0 #声明一个变量求和,初始值为0 ...

随机推荐

  1. Tensorflow的gRPC编程(一)

    https://blog.csdn.net/langb2014/article/details/69559182 如何用TF Serving部署TensorFlow模型 https://www.jia ...

  2. 代码实现程序启动后, 可以从键盘输入接收多个整数, 直到输入quit时结束输入. 把所有输入的整数倒序排列打印

    package com.loaderman.test; import java.util.Comparator; import java.util.Scanner; import java.util. ...

  3. [idea]创建一个控制台程序

    新建项目时,选择JBoss即可.

  4. LoadRunner脚本编写之一

    LoadRunner脚本编写之一 性能测试工程师要懂代码么?答案是必须的.好多测试员认为在loadrunner中编写脚本很难很牛X ,主要是大多测试人员并未做过开发工作,大学的那点程序基础也忘记的差不 ...

  5. 2019.12.04 ADT on eclipse 配置篇

    今天看JerryWang的简书博客https://www.jianshu.com/p/74ad8e4bbc49 ,SAP GUI 和ADT是互为补充的关系,有很多SAP新出的技术都没有办法在GUI上开 ...

  6. Datafactory 学习笔记

    1)插入汉字出现乱码的情况 select userenv('language') from dual: select * from V$NLS_PARAMETERS: 把下面变量名和变量值配置到系统环 ...

  7. zabbix监控ssl证书过期时间

    获取证书过期时间脚本: /etc/zabbix/scripts/check-cert-expire.sh: #!/bin/bash host=$ port=$ end_date=`/usr/bin/o ...

  8. [转帖]U盘安装centos 的方法

    通过U盘或CD/DVD装centos7,出现“dracut-initqueue timeout..."解决办法   1.在用CD/DVD挂载centos7镜像安装系统时,出现“dracut- ...

  9. mysql中的安全模式(sql_safe_updates)

    什么是安全模式 在mysql中,如果在update和delete没有加上where条件,数据将会全部修改.不只是初识mysql的开发者会遇到这个问题,工作有一定经验的工程师难免也会忘记写入where条 ...

  10. spring笔记3路径跳转

    ---恢复内容开始--- 页面跳转 <!--forward直接跳转--><jsp:forward page="pages/admin/member/add_pre.acti ...