如题

安装 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

操作步骤

  1. 如果 T 的 ~/.ssh/ 目录不存在,就手动创建,mkdir -p ~/.ssh
  2. 在服务器 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]-----+
  3. 将服务器 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 就不需要密码了。

注意

这种方式传文件,如果目标服务器的目标文件夹下存在同名文件,会在没有任何提示的情况下被覆盖掉

上传下载

  1. 上传本地文件到服务器:scp /path/filename username@servername:/path/
  2. 上传整个目录到服务器:scp -r local_dir username@servername:remote_dir
  3. 从服务器上下载文件:scp username@servername:/path/filename /var/www/local_dir
  4. 从服务器下载整个目录: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"

  1. 如果指令不止一个,必须要加双引号,否则,除了第一个指令,其余指令将会在本地执行。
  2. 两个指令之间用分号隔开。

示例一:查看远程服务器文件列表

远程服务器上的 ~/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 正在重启,同时,本地终端也同步显示了此日志的变化情况,如下图: