sftp+sshpass传输文件嘎嘎香

发布于:2024-12-18 ⋅ 阅读:(34) ⋅ 点赞:(0)

实现场景,要求客户端定时将本地的日志文件传输到服务器。

工作环境ubuntu,注意不通操作系统的版本不通,依赖的工具的版本也有所不同

实现目标需要客户端满足安装工具:

1、下载安装sshpass

---安装命令:sudo apt-get install sshpass

---使用实例:

基本传输命令如下:sshpass -p 密码 scp 本地路径文件 登录用户名@服务器地址:服务器保存路径

---传输文件夹实例:

est1为所需传输的文件夹;root是登录服务器的用户,后接着IP地址和将要存储的路径;-p后的123456是登录服务器的密码

sshpass -p 123456 scp -r test1 root@10.10.255.100:/home/test/

---传输文件实例:

home/test1/test.txt为所需传输的文件;root是登录服务器的用户,后接着IP地址和将要存储的路径;-p后的123456是登录服务器的密码

sshpass -p 123456 scp home/test1/test.txt root@10.10.255.100:/home/test/

---文件第一行读取密码连接服务器

home/test1/test.txt为要读取的文件;root是登录服务器的用户,后接着IP地址

sshpass -f home/test1/test.txt ssh root@10.10.255.100

----删除远程文件夹

/home/test为所需删除的文件夹;root是登录服务器的用户,后接着IP地址;-p后的123456是登录服务器的密码

sshpass -p 123456 ssh root@10.10.255.100 -tt rm -rf /home/test

----远程解压文件

命令:sshpass -p 密码 ssh root@ip -tt tar -xzf 远程文件.tar包 -C 解压路径
/home/test1/test.tar为所需解压的文件;/home/test2是解压路径;root是登录服务器的用户,后接着IP地址;-p后的123456是登录服务器的密码

sshpass -p 123456 ssh root@10.10.255.100 -tt tar -xzf /home/test1/test.tar -C /home/test2

Liunx-sshpass及scp命令在linux机器间文件传输 传输文件夹 远程删除文件夹 远程解压文件 远程连接服务器_sshpass scp-CSDN博客

2、下载安装cron工具

sudo apt update    //更新Ubuntu软件包列表

sudo apt install cron   //更新Ubuntu软件包列表

sudo systemctl status cron   // 验证cron是否安装成功 

对于系统较老的版本,使用sudo service cron status 验证是否成功

sudo service cron status

crontab -e   //学习cron的基本使用方法

crontab文件中,每一行代表一个定时任务,格式如下:

* * * * * command_to_execute
- - - - -
| | | | |
| | | | +----- 星期几 (0 - 7) (Sunday=0 or 7)
| | | +------- 月份 (1 - 12)
| | +--------- 一个月中的第几天 (1 - 31)
| +----------- 小时 (0 - 23)
+------------- 分钟 (0 - 59)
例如:假设你有一个脚本/home/user/backup.sh,你希望它每天凌晨3点运行:

打开crontab编辑器

crontab -e

添加以下行到crontab文件中:

0 3 * * * /home/user/backup.sh

保存并退出编辑器。

现在,cron服务将每天凌晨3点自动运行/home/user/backup.sh脚本。

3、下载安装

4、采用sshpass传输本地文件内的所有文件

通过scp命令传输文件有最大数量的限制,因此最好采用循环文件夹内所有的文件进行文件传输

传输脚本百度查询的实例:

#!/bin/bash

# 远程服务器的用户名、主机和密码

USER='your_username'

HOST='your_host'

PASS='your_password'

# 本地和远程的文件夹路径

LOCAL_DIR='/path/to/local/folder'

REMOTE_DIR='/path/to/remote/folder'

# 循环发送本地文件夹中的所有文件

for file in "$LOCAL_DIR"/*; do

filename="$(basename "$file")"

sshpass -p "$PASS" scp "$file" "$USER@$HOST:$REMOTE_DIR/$filename"

done

请确保你已经安装了 sshpass 工具,并且将脚本中的 your_usernameyour_hostyour_password/path/to/local/folder 和 /path/to/remote/folder 替换成适当的值。

注意:明文存储密码并不安全,考虑使用更安全的方法,如 SSH 密钥或使用环境变量来传递密码。

5、定时任务执行

最后就要实现定时任务,然而配置完cron定时任务后,没有执行,我遇到是是普通用户执行可以,root用户不可以执行。

经过测试验证,无论是普通用户还是root用户都需要先调用ssh的命令连接一下,根据提示操作输入远程登录密码之后,会在当前的用户目录下的.ssh目录中产生一个known_hosts文件,保存连接信息,然后在执行sshpass命令就正常了。

问题解决过程:

a、由于远程机器从未连接过,检查当期那用户目录下的known_hosts文件: cat ~/.ssh/known_hosts  看有没有该ip(远程ip)的信息,如果没有说明没有连接过该机器

需要先用ssh命令连接一下远程机器:StrictHostKeyChecking=no deploy@168.28.1.123

$ ssh -p 22-o StrictHostKeyChecking=no  deploy@168.28.1.123 
deploy@168.28.1.123's password: #输入密码确认 

确认之后在进行检查一下known_hosts文件,发现有该机器的地址sha2记录了
$ vi ~/.ssh/known_hosts
[168.28.1.123]:22 ecdsa-sha2-nistp256 AAAssssssxyzxyzhLXNxxxxxxmlzdHAyxxxxxxAyyyyyyyyyyyeyyyyyyyyyyyyyOxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0dZpIzA=

b、然后再用sshpass命令即可

sshpass -p '123#456' scp -r -P 3577 /home/file_deploy@168.28.1.123:/home/file
 

说明:

~/.ssh/known_hosts 文件的作用?
ssh会把你所有访问过的电脑的公钥(public key)都记录在~/.ssh/known_hosts文件。
当下次访问相同电脑时,OpenSSH会核对公钥,
如果核对不上,OpenSSH会发出警告, 避免你受到DNS Hijack之类的攻击。