前言

在实际工作中,经常会将本地的一些文件传送到远程的机器上。scp是一个很好用的命令,缺点是需要手工输入密码。

如何在shell脚本中实现传输文件,而不用手工输入密码呢?接下来介绍三种方法。

一、建立SSH的信任关系(不推荐)

过程较繁琐,故不考虑这种情况,有兴趣可以参考博客最后给出的链接。

二、使用sshpass工具(推荐)

2.1 sshpass工具的安装(介绍两种方式)

先检查系统有没有sshpass

whereis sshpass

a. yum安装

yum install sshpass

b. 源码安装

sshpass安装包下载地址:https://sourceforge.net/projects/sshpass/files/

解压安装

tar -zxvf sshpass-1.06.tar.gz
cd sshpass-1.06
./configure
make
make install

2.2 sshpass工具的使用

测试是否安装成功

man sshpass

使用 sshpass -p password scp file user@ip:dir, 示例如下

sshpass -p oracle scp /home/oracle/single.txt oracle@192.168.56.12:/home/oracle

三、使用expect工具

3.1 expect工具的安装(介绍两种方式)

先检查系统有没有expect

whereis expect

a. yum安装

yum install expect

b. 源码安装

expect工具是依赖tcl的,所以也需要安装tcl

tcl安装包下载地址:https://sourceforge.net/projects/tcl/files/Tcl/8.4.19/tcl8.4.19-src.tar.gz

解压安装

tar zxvf tcl8.4.19-src.tar.gz
cd tcl8.4.19/unix
./configure
make
make install

expect安装包下载地址:http://sourceforge.net/projects/expect/files/Expect/5.45/expect5.45.tar.gz

解压安装

tar -zxvf expect5.45.tar.gz
cd expect5.45
./configure --with-tcl=/usr/local/lib --with-tclinclude=../tcl8.4.19/generic
make
make install
ln -s /usr/local/bin/expect /usr/bin/expect

3.2 expect工具的使用  

测试是否安装成功

expect

出现下面界面就表示安装成功

expect1.>
expect1.> exit

通过一个示例,演示如何使用expect

a.先创建一个脚本

vi test.exp

#!/usr/bin/expect
set timeout -1
spawn scp /home/oracle/single.txt oracle@192.168.56.12:/home/oracle
expect "*password:"
send "oracle\n" #这里填远程用户的密码
expect "100%"
expect eof

b.测试运行脚本

chmod +x test.exp
expect test.exp

c.将脚本加到crontab里

crontab -e

* * * * * expect /home/oracle/test.exp &> /home/oracle/test.log

expect比sshpass用起来更复杂,但expect功能更加强大,并不仅仅适用于scp,还适用于其它很多需要交互的命令。

参考文档:
《几种方法来实现scp拷贝时无需输入密码》:https://blog.csdn.net/nfer_zhuang/article/details/42646849
《sshpass的安装使用》:https://blog.csdn.net/qq_30553235/article/details/78711491
《Expect工具的安装及使用方法》:https://blog.csdn.net/wangtaoking1/article/details/78268574

Linux - 几种方法来实现scp拷贝时无需输入密码的更多相关文章

  1. 几种方法来实现scp拷贝时无需输入密码

    欢迎转载!转载时请注明出处:http://blog.csdn.net/nfer_zhuang/article/details/42646849 前言 我在工作中经常要将一些文件传输到另外一个服务器上, ...

  2. Java字符串比较(3种方法)以及对比 C++ 时的注意项

    字符串比较是常见的操作,包括比较相等.比较大小.比较前缀和后缀串等.在 Java 中,比较字符串的常用方法有 3 个:equals() 方法.equalsIgnoreCase() 方法. compar ...

  3. 几种方法实现ajax请求内容时使用浏览器后退和前进功能

    ajax是一个非常好玩的小东西,不过用起来也会存在一些问题. 我们可以利用ajax进行无刷新改变文档内容,但是没办法去修改URL,即无法实现浏览器的前进与后退.书签的收藏功能. 利用location的 ...

  4. 通过scp拷贝文件时无需交互输入密码

    工作中经常需要把一些文件从一个服务器传输到另一台服务器,linux环境下最习惯的方式当然是scp,但是scp需要交互输入密码有时候觉得麻烦,记录几种无需手动输入密码的方法. 方法一:建立SSH互信 此 ...

  5. js去掉字符串前后空格的五种方法

    转载 :http://www.2cto.com/kf/201204/125943.html 第一种:循环检查替换[javascript]//供使用者调用  function trim(s){  ret ...

  6. js去掉字符串前后空格的五种方法(转)

    出处:http://www.2cto.com/kf/201204/125943.html 第一种:循环检查替换[javascript]//供使用者调用  function trim(s){  retu ...

  7. 【转】VC 多线程中控制界面控件的几种方法

    原文网址:https://software.intel.com/zh-cn/blogs/2010/11/30/vc-3 为了保证界面的用户体验经常要把数据处理等放到子线程中进行,然后把结果更新到主界面 ...

  8. ToStringBuilder学习(二):两种方法用法优缺点及一个问题

    研究ApacheCommon源码, 先从一个最简单的开始,即围绕Object类里的toString方法自动化实现的一系列类.         怎么来自动化地实现toString方法, 有两种:反射和手 ...

  9. 修改android的wifi客户端名称的两种方法

    修改android的wifi客户端名称的两种方法     手机连接到无线路由时,在dhcp的客户端列表里面是这样的名称"android-89425253e5de3a2",这就是安卓 ...

随机推荐

  1. Think in Java 笔记(chapter1-7)

    Content Chapter 1:对象导论 Chapter 2:一切都是对象 Chapter 3:操作符 Chapter 4:控制执行流程 Chapter 5:初始化与清理 Chapter 6:访问 ...

  2. ESP8266源码分析--打印的基本用法

    缘由: 物联网小芯片中,很多都不是特别复杂,绝大多数问题都需要靠串口打印就能定位的.所以,串口打印是一个非常靠谱的玩意.一定要好好的利用.ESP8266的打印模板设计的特别好,这里我就列出来,供大家参 ...

  3. Javascript模块化开发3——Grunt之预处理

    一.grunt预处理简述 grunt的注册任务函数本身会对传入的参数和配置对象里的相关属性进行一定的预处理,方便任务函数进行操作. grunt的registerTask方法和registerMulti ...

  4. SPARQL入门(二)使用Java操作ARQ

      在文章SPARQL入门(一)SPARQL简介与简单使用中,我们了解了RDF.SPARQL以及基于Java编写的SPARQL处理器ARQ.在本文中,笔者将会如何使用Java来操作ARQ.   注意到 ...

  5. 图数据库 Nebula Graph 的安装部署

    Nebula Graph:一个开源的分布式图数据库.作为唯一能够存储万亿个带属性的节点和边的在线图数据库,Nebula Graph 不仅能够在高并发场景下满足毫秒级的低时延查询要求,还能够实现服务高可 ...

  6. PHP中RBAC权限管理

    1.RBAC概念和原理          RBAC:全称叫做Role-Based Access Control,中文翻译叫做基于角色的访问控制.其主要的作用是实现项目的权限控制.            ...

  7. Eclipse 的快捷键

    1. 代码折叠的快捷键,默认是: Ctrl+Shift+Numpad_Divede(小键盘的/号) Ctrl+Shift+Numpad_Multiply(小键盘的*号) 2.删除一行:Ctrl+D 3 ...

  8. iOS多线程定时器

    在使用定时器时,我们经常使用NSTimer,但是由于NSTimer会受RunLoop影响,当RunLoop处理的任务很多时,就会导致NSTimer的精度降低,所以在一些对定时器精度要求很高的情况下,应 ...

  9. 详解 DNS 与 CoreDNS 的实现原理

    域名系统(Domain Name System)是整个互联网的电话簿,它能够将可被人理解的域名翻译成可被机器理解 IP 地址,使得互联网的使用者不再需要直接接触很难阅读和理解的 IP 地址. http ...

  10. 此 iCloud 帐户已经存在。

    0x00 事件 将 Apple ID 换了一个邮箱,然后在 macOS 重新登陆的时候出现登录不上异常,始终显示 若要将此 Apple ID 用作主要的 iCloud 帐户,请从"互联网帐户 ...