安装 scp
如果提示:-bash: scp: command not found
, 执行下面的命令安装:1
yum install -y openssh-clients
免密码配置
- 通常用scp命令通过ssh获取对方linux主机文件的时候都需要输入密码确认,不过通过建立信任关系,可以实现不输入密码。
- 建立的信任关系可在两台服务器的任何用户之间,下面的示例,两台服务器的用户都是 root,实际操作时,把 root 换成你的真实用户名即可。
- 假设:
- 传输文件的服务器 S(source) 的IP:192.168.1.100
- 接收文件的服务器 T(target) 的IP:192.168.1.101
- 目标:从服务器 S 免密码传文件至服务器 T
操作步骤
- 如果 T 的
~/.ssh/
目录不存在,就手动创建,mkdir -p ~/.ssh
。 在服务器 S 上执行命令
ssh-keygen -t rsa
来生成密钥,一路回车就行了。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22[root@localhost ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:7EM99i0eL03+glViCN0cn+9ELeM8J2sLyvDW26SaB/g root@localhost.localdomain
The key's randomart image is:
+---[RSA 2048]----+
| . o.. |
| . . o.o|
| . .o.+|
| . . .oo+o|
| S.+ .=o+|
| o...o .oB |
| +. o=*= .|
| =E+=X+. |
| .*o+o+o.|
+----[SHA256]-----+将服务器 S
/root/.ssh/
目录中的id_rsa.pub
文件内容复制到服务器 T/root/.ssh/
目录下的 authorized_keys 文件中,注意是文件内容:- 如果 T 的
/root/.ssh/
目录下没有 authorized_keys 文件,就上传并改名为 authorized_keys:scp .ssh/id_rsa.pub root@192.168.1.101:~/.ssh/authorized_keys
- 如果 T 的
~/.ssh/
目录已经存在 authorized_keys 文件,用cat >>
命令将公钥文件id_rsa.pub
的内容添加进去,文件 authorized_keys 是可以包含多个 SSH 验证信息的。- 在服务器 S 上执行
scp ~/.ssh/id_rsa.pub root@192.168.1.101:~/.ssh/s.pub
- 在服务器 T 上执行
cat ~/.ssh/s.pub >> ~/.ssh/authorized_keys
- 在服务器 S 上执行
- 如果 T 的
以后从服务器 S 通过 scp 传文件到服务器 T 就不需要密码了。
注意
这种方式传文件,如果目标服务器的目标文件夹下存在同名文件,会在没有任何提示的情况下被覆盖掉。
上传下载
- 上传本地文件到服务器:
scp /path/filename username@servername:/path/
- 上传整个目录到服务器:
scp -r local_dir username@servername:remote_dir
- 从服务器上下载文件:
scp username@servername:/path/filename /var/www/local_dir
- 从服务器下载整个目录:
scp -r username@servername:/var/www/remote_dir/ /var/www/local_dir
执行远程服务器上的 shell 脚本
语法
ssh + 建立好信任关系的用户名@远程服务器IP地址 + “第一个 shell 指令; 另一个 shell 指令”,如:ssh utomcat@IP "cd ~/tomcat/dev/job ; ls -l --color=auto"
- 如果指令不止一个,必须要加双引号,否则,除了第一个指令,其余指令将会在本地执行。
- 两个指令之间用分号隔开。
示例一:查看远程服务器文件列表
远程服务器上的 ~/tomcat/dev/job
为 tomcat 目录:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17[utomcat@localhost logs]$ ssh utomcat@192.168.1.101 "cd ~/tomcat/dev/job ; ls -l --color=auto"
total 128
drwxr-x---. 3 utomcat gtomcat 4096 Aug 17 23:43 bin
-rw-r-----. 1 utomcat gtomcat 18982 Aug 17 23:43 BUILDING.txt
drwxr-x---. 3 utomcat gtomcat 18 Aug 17 23:43 C:
drwx------. 3 utomcat gtomcat 254 Aug 17 23:44 conf
-rw-r-----. 1 utomcat gtomcat 5407 Aug 17 23:43 CONTRIBUTING.md
drwxr-x---. 2 utomcat gtomcat 4096 Aug 17 23:43 lib
-rw-r-----. 1 utomcat gtomcat 57092 Aug 17 23:43 LICENSE
drwxr-x---. 2 utomcat gtomcat 4096 Sep 3 09:30 logs
-rw-r-----. 1 utomcat gtomcat 2333 Aug 17 23:43 NOTICE
-rw-r-----. 1 utomcat gtomcat 3255 Aug 17 23:43 README.md
-rw-r-----. 1 utomcat gtomcat 6852 Aug 17 23:43 RELEASE-NOTES
-rw-r-----. 1 utomcat gtomcat 16262 Aug 17 23:43 RUNNING.txt
drwxr-x---. 2 utomcat gtomcat 30 Aug 17 23:43 temp
drwxr-x---. 7 utomcat gtomcat 81 Aug 17 23:43 webapps
drwxr-x---. 3 utomcat gtomcat 22 Sep 2 09:57 work
示例二:执行远程服务器上的 shell 脚本文件并同步监听 tomcat 日志
- 远程服务器上的脚本文件
reBuildAndRestartTomcatAndTailLog.sh
作用是获取 java 项目最新代码并重新编译,编译完成之后重启 tomcat 并监听 tomcat 日志变化。 - 先在远程服务器终端执行
tail -f ~/tomcat/logs/catalina.out
监听 tomcat 日志,观察 tomcat 是否会被重启。 - 然后,在本地服务器的终端执行:
ssh utomcat@192.168.1.101 "~/shell/reBuildAndRestartTomcatAndTailLog.sh"
。 - 执行结果,远程服务器的日志文件 catalina.out 已经开始有变化了,从变化看,tomcat 正在重启,同时,本地终端也同步显示了此日志的变化情况,如下图: