如何在重启或关机之前执行scp命令?

it_*_*ure 9 ssh scp reboot systemctl

我想在重启或关机之前上传文件.
1.从我的vps到vps
设置upload.service

vim /etc/systemd/system/upload.service
[Unit]
Description=upload files into my vps
Before=shutdown.target reboot.target
Requires=network-online.target
After=network.target

[Service]
ExecStart=/bin/true
ExecStop=/bin/bash /home/upload.sh

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

upload.sh的脚本

vim /home/upload.sh
/usr/bin/scp -P 22 -i /home/.ssh/id_rsa /home/wp.bak root@remote_ip:/home
Run Code Online (Sandbox Code Playgroud)

是时候测试一下了.

systemctl enable upload
reboot
Run Code Online (Sandbox Code Playgroud)

验证wp.bak可以在重启时从我的vps1上传到vps2.
2.从家里的电脑到vps
ssh凭证已在家里的电脑和vps之间建立.
与case1相同的设置.

journalctl -u upload
Started upload files into my vps.
ssh: connect to host xxxxxxxxxx port 22: Network is unreachable
lost connection
Run Code Online (Sandbox Code Playgroud)

这是没有用的,写After=network.targetAfter=network.target ssh.service.

像nbari说的那样.

sudo vim /etc/systemd/system/upload.service
[Unit]
Description=upload files into my vps
Before=shutdown.target reboot.target
After=network.target network-online.target 
Requires=network-online.target network.target    

[Service]
Type=oneshot
RemainAfterExit=true
ExecStop=/bin/bash /home/debian9/upload.sh  

[Install]
WantedBy=multi-user.target


sudo vim  /home/upload.sh 
/usr/bin/scp -P 22 -i /home/.ssh/id_rsa /home/wp.bak root@remote_ip:/home 

sudo systemctl daemon-reload 
sudo systemctl enable upload
Run Code Online (Sandbox Code Playgroud)

重启pc.

sudo journalctl -u upload
-- Logs begin at Fri 2018-04-27 10:46:34 HKT, end at Fri 2018-04-27 11:00:23 HKT
Apr 27 10:46:51 hwy systemd[1]: Started upload files into my vps.
Run Code Online (Sandbox Code Playgroud)

似乎上传服务工作正常.

问题1:为什么

ExecStart=/bin/true
ExecStop=/bin/bash /home/upload.sh
Run Code Online (Sandbox Code Playgroud)

我的vps工作正常吗?

为什么

RemainAfterExit=true
ExecStop=/bin/bash /home/upload.sh  
Run Code Online (Sandbox Code Playgroud)

可以工作而不是

ExecStart=/bin/true
ExecStop=/bin/bash /home/upload.sh
Run Code Online (Sandbox Code Playgroud)

在我的家用电脑?

issue2:

wp.​​bak是一个超过3G的大文件.
time /usr/bin/scp -P 22 -i /home/.ssh/id_rsa /home/wp.bak root@remote_ip:/home花费我3000s(50分钟,差不多一小时)或更多.
在我的电脑中获取文件大小

ls  -al  /home/wp.bak
-rw-r--r-- 1 debian9 debian9 3977379840 Apr 22 12:23 /home/wp.bak
Run Code Online (Sandbox Code Playgroud)

在我的vps中获取上传的文件大小.

ssh root@vps_ip
ls  -al  /home/wp.bak
-rw-r--r-- 1 root root 63045632 Apr 27 02:46 /home/wp.bak
Run Code Online (Sandbox Code Playgroud)

为什么只有1.6%,它的一小部分上传?
63045632/3977379840 = 0.0158
我的仆人 - 家用电脑骗了我.
请详细说明.

nba*_*ari 3

我可以scp在重新启动之前使用以下命令上传文件,使用稍微不同的服务配置/etc/systemd/system/upload.service::

[Unit]
Description=upload files into my vps
Requires=network.target
After=network.target
Before=shutdown.target reboot.target halt.target
DefaultDependencies=no

[Service]
Type=oneshot
RemainAfterExit=true
ExecStop=/bin/bash /root/upload.sh

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

我不得不使用RemainAfterExit=true, 而不是ExecStart=/bin/true

创建服务后我运行systemctl daemon-reloadsystemctl enable yourservice

我在以下位置使用它进行了测试upload.sh

scp /root/foo.txt foo@10.10.1.14:
Run Code Online (Sandbox Code Playgroud)

之前我设置了 ssh-keys 以防止提示输入密码/密码短语

的输出journalctl -u upload

Apr 26 08:35:53 my-vm systemd[1]: Started upload files into my vps.
Apr 26 08:35:53 my-vm systemd[1]: Starting upload files into my vps...
Run Code Online (Sandbox Code Playgroud)

作为后备,你也可以使用:

upload.sh && reboot
Run Code Online (Sandbox Code Playgroud)

在这种情况下,只有当您的脚本成功时它才会重新启动upload