最近编程中用到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. Hibernate HelloWorld案例

    搭建一个Hibernate环境,开发步骤: 1. 下载源码 版本:hibernate-distribution-3.6.0.Final 2. 引入jar文件          hibernate3.j ...

  2. OpenStack 高性能虚拟机之大页内存

    目录 文章目录 目录 前文列表 虚拟存储器系统 页式虚拟存储器 大页内存 Linux 的大页内存 大页的实现原理 大页内存配置 透明巨型页 THP 大页面对内存的影响 Nova 虚拟机的大页内存设置 ...

  3. mariadb数据库(4)集群

    [主从架构]确保主从的两个数据库一致. um配置 [mariadb] name=MariaDB baseurl=http://mirrors.ustc.edu.cn/mariadb/yum/10.3/ ...

  4. Qt QLabel添加cliked事件

    #ifndef MYLABEL_H #define MYLABEL_H #include <QObject> #include <QLabel> class MyLabel : ...

  5. ES5与ES6常用语法教程之 ①函数写法、创建对象、导入导出模块方式

    函数写法区别 计算a, b两个数字之和,有返回值 es5 写法 function add(a, b) { return a + b; } es6 写法(箭头函数) let add = (a, b) = ...

  6. office web apps安装部署,配置https,负载均衡(七)配置过程中遇到的问题详细解答

    该篇文章,是这个系列文章的最后一篇文章,该篇文章将详细解答owa在安装过程中常见的问题. 如果您没有搭建好office web apps,您可以查看前面的一系列文章,查看具体步骤: office we ...

  7. C#与Unity 数据存储

    使用Json存储数据 1.创建Json文件,直接创建txt文件,将后缀名改为xx.json 2.Json文件的数据格式,中括号表示列表,即中括号下的每个逗号隔开的内容都是列表的每个元素,花括号表示对象 ...

  8. typeScript入门配置

    typeScript是有微软开发的一款开源的编程语言. TypeScript是JavaScript的一个超集,从今天数以百万计的JavaScript开发者所熟悉的语法和语义开始.可以使用现有的Java ...

  9. C#中StringBuilder类的使用总结

    String 对象是不可改变的.每次使用 System.String 类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间.在需要对字符串执行重复修改的情况下,与创建新 ...

  10. Cobalt Strike DLL用于永恒之蓝注入

    PDF下载:blob:https://www.52stu.org/9afe109c-f95f-4cb3-a180-90d469a1d001 我们在对存在MS17010的漏洞主机进行DLL注入的时候,一 ...