实现场景,要求客户端定时将本地的日志文件传输到服务器。
工作环境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_username
、your_host
、your_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之类的攻击。