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

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


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/bash

local_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 服务器上,并且避免手动输入密码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搞什么滚去学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值