如题
如果提示:-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 通过 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 正在重启,同时,本地终端也同步显示了此日志的变化情况,如下图: