【linux基础】linux远程传输三种免交互方式

linux远程传输三种免交互方式

文章目录

    • linux远程传输三种免交互方式
    • 1、使用sshpass工具
    • 2、使用expect脚本来输入密码
    • 3、SSH 密钥对


1、使用sshpass工具

建立信任关系的做法是最方便和安全的做法,但是在有些场景下(比如远端的authorized_keys是不能随意更改的),那么这个时候我们就可以借助sshpass这个第三方工具来完成ssh连接时的密码输入。先看一下sshpass的man手册中是如何描述的

 sshpass - noninteractive ssh password provider从描述上就可以清晰的了解到,sshpass的设计就是为了使用非交互的场景下输入ssh连接的密码。sshpass的使用比较简单,先看一下帮助文档:root@localhost:~# sshpass Usage: sshpass [-f|-d|-p|-e] [-hV] command parameters-f filename   Take password to use from file从文件中读取密码-d number     Use number as file descriptor for getting password使用文件描述符来获取密码-p password   Provide password as argument (security unwise)将密码作为参数传递(安全性不佳,不推荐使用)-e            Password is passed as env-var "SSHPASS"将密码作为环境变量 "SSHPASS" 来传递With no parameters - password will be taken from stdin 如果没有参数 - 密码将从标准输入(stdin)获取-h            Show help (this screen)显示帮助信息(当前屏幕)-V            Print version information 打印版本信息At most one of -f, -d, -p or -e should be used

-f filename:从指定的文件中读取密码。文件中应只包含密码,使用该选项时应注意保护好该文件的访问权限,以免泄露密码。
-d number:使用指定的文件描述符来获取密码。这是一种高级用法,一般情况下不常用。
-p password:直接将密码作为参数传递给 sshpass。这种方式不安全,因为密码会在命令行中可见,不推荐在生产环境中使用。
-e:将密码作为名为 “SSHPASS” 的环境变量传递给 sshpass。这种方式相对于将密码直接作为参数传递要更安全一些。
如果没有任何选项:sshpass 将从标准输入(stdin)获取密码。这种方式适合于将密码与脚本结合使用,不会直接在命令行中暴露密码。
其中-p是直接指定密码,-f是从文件中读取密码。那么一个使用sshpass的简单例子就是:

[root@node1 ~]# sshpass -f pa.txt scp index root@10.66.110.199:/var<br>
[root@node1 ~]# sshpass -p root1234 scp config.log root@10.66.110.199:/root/a.lo

使用sshpass的好处就是方便直接,无需了解公私钥、加密认证等相关知识,简单易懂;但是使用sshpass最大的坏处就是在使用时会涉及到明文密码,大大降低了安全性。

2、使用expect脚本来输入密码

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

下面就是一个使用expect来完成scp时无需输入密码的脚本:

#!/usr/bin/expect# 设置超时时间
set timeout 60# 获取命令行参数
set compressed_file [lindex $argv 0]
set remote_user [lindex $argv 1]
set remote_host [lindex $argv 2]
set remote_dir [lindex $argv 3]
set remote_pass [lindex $argv 4]# 执行scp命令进行文件传输
spawn scp $compressed_file $remote_user@$remote_host:$remote_dir# 期望匹配的提示符,根据实际情况修改
expect {"*assword:" {# 匹配到密码提示,发送密码send "$remote_pass\r"exp_continue}"yes/no" {# 第一次连接时会询问是否确认连接,输入yes并回车send "yes\r"expect "*assword:"send "$remote_pass\r"exp_continue}eof {# 文件传输结束exit}timeout {# 超时处理send_user "传输超时或失败\n"exit 1}
}# 等待传输完成
expect eof

代码刚开始的第一行,指定了expect的路径,与shell脚本相同,这一句指定了程序在执行时到哪里去寻找相应的启动程序。代码刚开始还设定了timeout的时间为10秒,如果在执行scp任务时遇到了代码中没有指定的异常,则在等待10秒后该脚本的执行会自动终止。

从以上代码刚开始的几行可以看出,我为这个脚本设置了5个需要手动输入的参数,分别为:目标主机的IP、用户名、密码、本地文件路径、目标主机中的文件路径。如果将以上脚本保存为expect_scp文件,则在shell下执行时需要按以下的规范来输入命令:

expect -f /path/to/transfer.expect "/data/mysqlbeifen/ceshi.txt" "root" "10.66.110.199" "/opt/mysqlbackup/" "123456" > /dev/null 2>&1

以上的命令执行后,将把本地data/mysqlbeifen/目录下的文件拷贝到用户名为root,密码为123456的主机10.66.110.199中的/opt/mysqlbackup/下,同时还将这个源文件重命名为dest_file。

spawn代表在本地终端执行的语句,在该语句开始执行后,expect开始捕获终端的输出信息,然后做出对应的操作。expect代码中的捕获的(yes/no)内容用于完成第一次访问目标主机时保存密钥的操作。有了这一句,scp的任务减少了中断的情况。代码结尾的expect eof与spawn对应,表示捕获终端输出信息的终止。

使用expect需要了解的一点是:用expect速度会比较慢,因为需要等待返回的数据,然后输入命令执行,没有ssh密钥登录的快速。

3、SSH 密钥对

要实现从 10.66.110.200 服务器上通过 SCP(Secure Copy)方式将文件传输到 10.66.110.91 服务器上,并且避免手动输入密码,可以按照以下步骤操作:

在本地服务器 10.66.110.200 上操作:
生成 SSH 密钥对(如果尚未生成):

ssh-keygen -t rsa -b 4096

按照提示生成 SSH 密钥对,可以选择保留空白密码。

Enter file in which to save the key (/root/.ssh/id_rsa):这是询问您要将私钥保存在哪个文件中的提示。默认情况下,私钥会保存在 /root/.ssh/id_rsa 文件中。您可以按 Enter 使用默认值,或者输入其他路径和文件名来保存私钥。
Enter passphrase (empty for no passphrase):这是询问您是否要为私钥设置密码短语(passphrase)。密码短语是一个可选项,它会为您的私钥提供额外的安全性。如果您希望设置密码短语,请在此处输入密码短语;如果不希望设置,请直接按 Enter 跳过。
Enter same passphrase again:如果您选择了设置密码短语,则需要再次确认输入相同的密码短语。
Your identification has been saved in /root/.ssh/id_rsa:这条消息告诉您私钥已经成功生成并保存在指定的文件中(默认为 /root/.ssh/id_rsa)。
Your public key has been saved in /root/.ssh/id_rsa.pub:这条消息告诉您公钥已经成功生成并保存在指定的文件中(默认为 /root/.ssh/id_rsa.pub)。
The key fingerprint and randomart image:这两段信息是用来验证密钥的额外信息:
Key fingerprint (SHA256:7MJuHX6DMcNsSUqk0zCgaJ+WCzUPHqKT/Sf0j0x5lMs): 这是密钥的指纹,用于标识密钥的唯一性。
Randomart image: 这是一种用ASCII字符表示的图形化展示密钥的方式,可以帮助您视觉上确认密钥的正确性。

将公钥复制到远程服务器 10.66.110.91 上:

使用 ssh-copy-id 命令将本地生成的公钥添加到目标服务器的 ~/.ssh/authorized_keys 文件中。假设目标服务器用户名为 remote_user,执行以下命令:

ssh-copy-id -i ~/.ssh/id_rsa.pub remote_user@10.66.110.91

如果你选择手动添加公钥,可以将 ~/.ssh/id_rsa.pub 文件的内容复制并粘贴到 remote_user@10.66.110.91 服务器的 ~/.ssh/authorized_keys 文件中。

测试 SSH 连接:

确保你可以通过 SSH 连接到目标服务器而无需输入密码:

ssh remote_user@10.66.110.91

如果连接成功而无需密码,则表示 SSH 配置正确。

在脚本中使用 SCP 进行文件传输:

编写一个脚本来执行文件传输操作。假设要传输的文件为 /path/to/local/file.txt,目标位置为 /path/to/remote/:

#!/bin/bashlocal_file="/path/to/local/file.txt"
remote_user="remote_user"
remote_ip="10.66.110.91"
remote_dir="/path/to/remote/"scp -i ~/.ssh/id_rsa "$local_file" "$remote_user@$remote_ip:$remote_dir"
scp -i ~/.ssh/id_rsa:使用指定的私钥文件进行身份验证。
"$local_file":本地文件路径。
"$remote_user@$remote_ip:$remote_dir":远程服务器的用户名、IP地址和目标路径。

运行脚本:

确保脚本有执行权限 (chmod +x script.sh),然后运行它:

./script.sh

脚本将会把本地的文件传输到远程服务器 10.66.110.91 的指定目录中,整个过程将是免交互的,不需要手动输入密码。

通过这些步骤,你可以在 10.66.110.200 服务器上实现通过 SCP 将文件传输到 10.66.110.91 服务器上,并且避免手动输入密码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/46764.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024.7.12单片机PWM

遇到了一个光标变成下划线的问题&#xff1a; Keil5光标变下划线&#xff0c;变回来的方法_keil5光标是下划线-CSDN博客 这里是用了输入捕获&#xff08;IC&#xff1a;input capture&#xff09;&#xff0c;输出比较&#xff08;OC:Output Compare&#xff09;区别 学到这…

解析DDD开发框架Axon

在微服务架构盛行的当下&#xff0c;领域驱动设计&#xff08;DDD&#xff09;也得到了崭新的发展。在DDD中包含了聚合、领域事件等核心概念&#xff0c;也需要引入CQRS、事件溯源等架构模式。对于开发人员而言&#xff0c;如何简单而高效的实现这些核心概念和架构模式是一大痛…

《简历宝典》13 - 简历中“项目经历”,内功学习 - 下篇

这一小节呢&#xff0c;我们继续说简历中 “项目经历” 的一些内功心法。因为项目经历比较核心&#xff0c;所以说完了&#xff0c;内功呢&#xff0c;我们会着重说一下 实战部分。 目录 1 所用技术的考虑 2 自我成长的突出 3 综合使用STAR法则 4 小节 1 所用技术的考虑 …

【利用Selenium+autoIt实现文件上传】

利用Selenium+autoIt实现文件上传 利用Selenium+autoIT实现文件上传autoIt脚本制作转换成exe文件java代码运行部分利用Selenium+autoIT实现文件上传 当你看到这篇文章时,证明你遇到了和我一样的难题。正常情况下我们利用selenium完全可以实现表单的提交和文件上传等操作。但当…

集群节点状态异常的解决方式

文章目录 集群节点状态异常的解决方式问题概述解决方式1.关闭所有服务2.对所有集群删除Hadoop相关文件2.1 删除Hadoop系统运行时创建的临时数据和文件2.2 删除Hadoop的数据文件 3.重新对Hadoop节点进行初始化和启用4.重启服务&#xff0c;检查节点状态 集群节点状态异常的解决方…

软件测试工作流程

1、目的 有效的保证软件质量;有效的制定不同测试类型(软件系统测试、音频主观性测试、专项测试、自动化测试、性能测试、用户体验测试)的软件测试计划;按照计划进行测试,发现软件中存在的问题;对软件中已经解决的问题进行有效的验证;判定测试过程和问题验证的有效性。2、…

Ext JS适用于哪些开发场景?

Ext JS是一个强大的JavaScript类库&#xff0c;它主要用于创建前端用户界面&#xff0c;是一个与后台技术无关的前端Ajax框架。基于其丰富的功能和特点&#xff0c;Ext JS适用于多种开发场景&#xff0c;主要包括以下几个方面&#xff1a; 1、富客户端AJAX应用 RIA&#xff08…

PostgreSQL(二十一)clog的作用与管理

一、CLOG的概念及作用 1、基础概念 &#xff08;1&#xff09;CLOG&#xff1a;记录事务号的状态&#xff0c;可以用其判断行的可见性。每个事务状态占用两个bit位。 tip&#xff1a;事务的状态有4种&#xff1a;IN_PROGRESS&#xff0c;COMMITTED&#xff0c;ABORTED和SUB_…

如何应对AI发展下的伦理挑战

目录 1.概述 2.构建可靠的AI隐私保护机制 2.1. 最小化数据收集 2.2. 数据去标识化 2.3. 加密技术 2.4. 分布式学习和边缘计算 2.5. 强化用户控制权 2.6. 独立审计和合规性检查 2.7. 持续教育和培训 2.8.小结 3.确保AI算法的公正性和透明度 3.1.增强AI决策透明度的方…

第一百五十九节 Java IO教程 - Java输入流、文件输入流、缓冲输入流、推回输入流

Java IO教程 - Java输入流 抽象基本组件是InputStream类。 InputStream|--FileInputStream |--ByteArrayInputStream |--PipedInputStream|--FilterInputStream|--BufferedInputStream |--PushbackInputStream |--DataInputStream |--ObjectInputStream我们有FileInputStream&…

【C++】——类和对象(中)

文章目录 类的默认成员函数构造函数析构函数拷贝构造函数赋值运算符重载运算符重载 const成员函数 类的默认成员函数 在C中&#xff0c;类&#xff08;class&#xff09;可以拥有多种成员函数&#xff0c;其中一些成员函数在类定义中没有显式声明时&#xff0c;编译器会隐式地…

JSON传输二进制

0x01 结论 JSON无法传输二进制, 若需要在JSON中传输二进制, 可以对二进制进行编码: 1. HEX To HexString 2. base64编码 若直接传送二进制, 其中无法被UTF-8解码的字节将被替换. Base64将会扩大30%的体积. 0x00 起因 我使用JSON提交了包含二进制的报文, 解析时发现很多字…

Windows上LabVIEW编译生成可执行程序

LabVIEW项目浏览器(Project Explorer)中的"Build Specifications"就是用来配置项目发布方法的。在"Build Specifications"右键菜单中选取"New"&#xff0c;可以看到程序有几种不同的发布方法&#xff1a;Application(EXE)、Installer、.Net Inte…

DFS和BFS(c++)

TOC 深度优先遍历dfs Depth First Search, 简称 DFS图解链接: link对每一个分支路径深入到不能再深入为止二叉树的深度优先遍历特殊&#xff0c;分为先序遍历、中序遍历、后序遍历先序遍历&#xff0c;对任一子树&#xff0c;先访问根&#xff0c;然后左子树&#xff0c;最后…

C++第七弹 -- C/C++内存管理

目录 前言一. C/C内存分布二. C语言中动态内存管理方式三. C中动态内存管理四. operator new与operator delete函数五. new和delete的实现原理1.内置类型2. 自定义类型 六. 定位new表达式(placement-new)七. 常见面试题总结 前言 在C/C编程中&#xff0c;内存管理是至关重要的…

超详细Midjourney国际版注册使用全流程

众所周知&#xff0c;目前Midjourney AI绘画的国内版本有很多种&#xff0c;甚至微信、浏览器插件等都有&#xff0c;眼花缭乱&#xff0c;使用门槛低&#xff0c;无需特殊网络手段即可访问使用。 不过&#xff0c;根据一些用户的反馈&#xff0c;尽管国内的那些版本在注册和充…

软件测试——测试用例

工作职责&#xff1a; 1.负责产品系统测试&#xff0c;包括功能测试、性能测试、稳定性测试、用户场景测试、可靠性测试等。 2.负责测试相关文档的编写&#xff0c;包括测试计划、测试用例、测试报告等。 3.负责自动化测试框架、用例的维护。 岗位要求&#xff1a; 1.熟练…

ng-container、‌ng-template 和 ng-content 区别

ng-container、‌ng-template 和 ng-content 都是 Angular 中用于处理和组织视图的工具&#xff0c;‌但它们各自具有不同的用途和行为。‌ ng-container&#xff1a;‌ 是一个虚拟的 HTML 容器&#xff0c;‌本身不会在最终渲染的 DOM 中创建任何实际的元素。‌它提供了一个包…

ref 和 reactive 区别

在Vue 3中&#xff0c;ref和reactive都是用于创建响应式数据的API&#xff0c;但它们之间存在一些关键的区别。以下是ref和reactive的主要区别&#xff1a; 1. 数据类型处理 ref&#xff1a;主要用于定义基本类型的数据&#xff08;如字符串、数字、布尔值等&#xff09;以及…

高阶面试-mongodb

mongodb的特点&#xff0c;为什么使用他 nosql数据库&#xff0c;前端到后端到数据库&#xff0c;都是json&#xff0c;无模式&#xff0c;数据模型发生变更&#xff0c;不需要强制更新表结构&#xff0c;可以快速实现需求迭代。 天生分布式&#xff0c;高可用&#xff0c;处…