Linux 命令之 scp

之前迁移服务器站点和数据的时候,我能想到的唯一办法是使用 ftp 工具将程序和数据库打包下载来,然后再使用 ftp 工具上传到另外一台服务器。这样的解决方案很浪费时间,经过同事介绍,使用 Linux 下的 scp 工具很容易的去完成服务器迁移工作,看来我这个半吊子程序员做运维还是不行滴 :)。。

scp 基于 ssh 登录,将当前主机文件 upload 给远程主机,或者将远程主机的文件 download 到当前操作主机。

当前主机文件 upload 给远程主机

复制文件

# 将本地的 /var/data.tar.gz 文件上传到 222.222.222.222 服务器的 data 目录下
# 文件名不变,命令执行后需要输入远程主机的 root 用户密码
scp /var/data.tar.gz root@222.222.222.222:/data/

# 将本地的 /var/data.tar.gz 文件上传到 222.222.222.222 服务器的 data 目录下
# 文件名变为 upload.tar.gz,命令执行后需要输入远程主机的 root 用户密码
scp /var/data.tar.gz root@222.222.222.222:/data/upload.tar.gz

# 将本地的 /var/data.tar.gz 文件上传到 222.222.222.222 服务器的 data 目录下
# 文件名不变,命令执行后需要输入远程主机的用户名字的密码
scp /var/data.tar.gz 222.222.222.222:/data/

# 将本地的 /var/data.tar.gz 文件上传到 222.222.222.222 服务器的 data 目录下
# 文件名变为 upload.tar.gz,命令执行后需要输入远程主机的用户名和密码
scp /var/data.tar.gz 222.222.222.222:/data/upload.tar.gz

复制目录

# 将本地的 /var/log 目录上传到 222.222.222.222 服务器的 data 目录下
# 即远程主机产生 /data/log/ 目录,命令执行后需要输入远程主机的 root 用户密码
scp -r /var/log/ root@222.222.222.222:/data/

# 将本地的 /var/log 目录上传到 222.222.222.222 服务器的 data 目录下
# 即远程主机产生 /data/log/ 目录,命令执行后需要输入远程主机的 root 用户密码
scp -r /var/log/ 222.222.222.222:/data/

远程主机文件 download 到当前主机文件

只要将上面《当前主机文件 upload 给远程主机》的后面两个参数(本地目录和远程目录)调换顺序就好,例如:

# 将远程主机的 data.tar.gz 文件下载到本地 /var/ 目录下
# 文件名不变,命令执行后需要输入远程主机的 root 用户密码
scp root@222.222.222.222:/data/data.tar.gz /var/


# 将远程主机的 /var/log/ 目录下载到当前主机的 data 目录下
# 即本地主机产生 /data/log/ 目录,命令执行后需要输入远程主机的 root 用户密码
scp -r 222.222.222.222:/var/log/ /data/

其他

如果远程主机的默认 SSH 端口被改的话,可以使用 -p 参数,例如:

scp -p 22001 root@222.222.222.222:/data/data.tar.gz /var/

还有一些其他参数, -v(显示进度)、 -4(使用 IPV4 地址), -6(使用 IPV6 地址)。

在使用 scp 的过程中,注意所使用的用户是否具有可读取远程服务器相应文件的权限。

如果你使用的是 OS X 系统或者 Linux 系统,还可以实现本地的文件上传,下载等功能。如果是 windows 系统的话,我没折腾过,大家可以试试。

Linux 之间传输文件的其他方式:

  • 一台主机安装 ftp Server,另外一台使用ftp的Client程序。
  • 采用samba服务。
  • 将文件放到 Web 目录下,另外一台进行 wget 下载(我能想到的只有这么多了)。

前两方式我没试过,不保证很简单。