分类 技术 下的文章

无论简单与否,我们都有机会去了解这么一件事,那就是备份的重要性从来都不可以被低估。考虑到备份的方法真的多如牛毛,你可能想要知道怎样来有效地为你的系统选择正确的工具和和合适的策略。

在本文中,我将为你介绍backup-manager,一个简单易用的命令行备份工具,在大多数的Linux发行版的标准软件库中都能见到它的身影。

是什么让备份管理器在众多的备份工具或备份策略中脱颖而出呢?让我来简单介绍一些它的与众不同的特性吧:

  • 简单的设计与管理:配置文件易于读懂和编辑,即便是初学者也很容易上手。
  • 一劳永逸:它在配置好后就可以通过cron周期性运作。
  • 支持多种协议远程备份:无缝整合多种传输协议、应用和云后端(如,FTP,SCP,SSH-GPG,rsync,AWS S3等等)来传输生成的归档包到一组远程主机。
  • 支持数据库备份:包括支持开箱即用备份MySQL/MariaDB和PostgreSQL数据库。
  • 支持加密:备份过程中支持基于GPG文件的加密。

在Linux上安装备份管理器

备份管理器的安装是快速而无痛的,因为它就包含在大多数Linux发行版的基础软件库中。

Debian,Ubuntu及其衍生版

# aptitude install backup-manager 

在基于Debian的系统中安装时,会提示你输入要存放备份归档文件的目录。如果选择的目录不存在,那么当你首次运行备份管理器时它会自动创建。

选择OK并按回车键。

在下一步中,会询问你要备份的所有目录(用空格分隔)。建议,但不是严格要求,列出同一父目录中的几个子目录,而不要仅仅输入父目录。

你可以跳过该步骤并在以后对配置文件中BM\_TARBALL\_DIRECTORIESb变量进行设置。否则的话,就请尽可能多地添加你想要的目录,然后选择OK:

Fedora或CentOS/RHEL

# yum install backup-manager 

在CentOS/RHEL上,在运行以上yum命令前,你将需要先启用EPEL仓库

配置备份管理器

备份管理器的主配置文件是/etc/backup-manager.conf。该文件被划分为几个章节,里面定义了备份方法和相关的变量(或“键值”),这些配置让备份管理器成为一个多样化的工具,可以广泛地应付各种状况。

出于演示目的,我们将考虑以下环境:

  • 每周对/etc,/home以及/var/log目录进行一次完整备份(我们将在下面通过cron设置备份的频率)。
  • 通过SSH传输.tar.gz备份归档文件到两台不同主机dev1和dev3上指定的目标目录。
  • 通过SSH备份本地MySQL数据库到相同目标主机。

用你喜爱的文本编辑器打开/etc/backup-manager.conf文件,并编辑以下变量。如果你愿意,你大可不必理会那些#开头的行。在本文中,它只是用作说明的注释:

# Specify the backup method(s) that will be used.
# tarball: takes a list of directories and builds the corresponding tarballs.
# mysql: archives MySQL databases using mysqldump. To restore the database, you # need to use the same tool manually.
export BM_ARCHIVE_METHOD="tarball mysql"

# Where to store the backups.
export BM_REPOSITORY_ROOT="/var/archives"

# The following directive indicates backup-manager to name 
# the generated files after the directory that was backed up.
export BM_TARBALL_NAMEFORMAT="long"

# Define the compression type for the generated files.
export BM_TARBALL_FILETYPE="tar.gz"

# List the directories that you want to backup.
export BM_TARBALL_DIRECTORIES="/etc /home /var/log"

# Exclude some subdirectories or file extensions.
export BM_TARBALL_BLACKLIST="/var/log/myotherapp.log *.mp3 *.mp4"

# List the database(s) that you want to backup, separated by spaces.
export BM_MYSQL_DATABASES="mysql mybase wordpress dotclear phpbb2"

# MySQL username.
export BM_MYSQL_ADMINLOGIN="root"

# MySQL password for username.
export BM_MYSQL_ADMINPASS="mypassword"

# Add support for DROP statements (optional).
export BM_MYSQL_SAFEDUMPS="true"

# The hostname or IP address where the database(s) reside.
export BM_MYSQL_HOST="localhost"

# Port where MySQL server is listening.
export BM_MYSQL_PORT="3306"

# Compression type (optional).
export BM_MYSQL_FILETYPE="gzip"

# Do not archive remote hosts, but only localhost.
BM_TARBALL_OVER_SSH="false"

# User account for SSH upload.
export BM_UPLOAD_SSH_USER="root"

# Absolute path of the user's private key for passwordless SSH login.
export BM_UPLOAD_SSH_KEY="/root/.ssh/id_rsa"

# Remote hosts (make sure you have exported your public key to them):
export BM_UPLOAD_SSH_HOSTS="dev1 dev3"

# Remote destination for uploading backups. If it doesn't exist, 
# this directory will be created automatically the first time
# backup-manager runs.
export BM_UPLOAD_SSH_DESTINATION="/var/archives/backups/$HOSTNAME"

运行备份管理器

要手动运行备份管理器,请输入以下命令。你也可以选择添加‘-v’标识以便一步一步详细检查运行过程。

# backup-manager 

BM\_TARBALL\_DIRECTORIES列出的目录将作为tarball备份到BM\_REPOSITORY\_ROOT目录,然后通过SSH传输到BM\_UPLOAD\_SSH\_DESTINATION指定的主机dev1和dev3。

正如你在上面图片中看到的那样,备份管理器在运行的时候创建了一个名为/root/.back-manager\_my.cnf的文件,MySQL密码通过BM\_MYSQL\_ADMINPASS指定。那样,mysqldump可以验证到MySQL服务器,而不必在命令行以明文格式接受密码,那样会有安全风险。

通过cron运行备份管理器

一旦决定哪一天是进行每周备份的最佳日子(最佳时间),你可以让cron来为你运行备份管理器。

打开root的crontab文件(注意,你必须以root登录):

# crontab -e 

假定你想要在星期天的上午5:15分运行备份管理器,那么就添加下面这行。

15 05 * * 0 /usr/sbin/backup-manager > /dev/null 2>&1

小结

在本文中,我已经展示了备份管理器这个备份工具是怎样的简单而强大,并且易于使用。在你的备份策略中,你可能还有其它几个选项需要考虑,请参阅手册页或用户手册,里面也包含了几个部署实例和建议。

希望此文对你有所帮助,请在下面随意提问和评论。


via: http://xmodulo.com/linux-backup-manager.html

作者:Gabriel Cánepa 译者:GOLinux 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

作为一个命令行探索者,你或许发现你自己一遍又一遍重复同样的命令。如果你总是用ssh进入到同一台电脑,如果你总是将一连串命令连接起来,如果你总是用同样的参数运行一个程序,你也许希望在这种不断的重复中为你的生命节约下几秒钟。

解决方案是使用一个别名(alias)。正如你可能知道的,别名用一种让你的shell记住一个特定的命令并且给它一个新的名字的方式。不管怎么样,别名有一些限制,它只是shell命令的快捷方式,不能传递或者控制其中的参数。所以作为补充,bash 也允许你创建你自己的函数,这可能更长一些和复杂一点,它允许任意数量的参数。

当然,当你有美食时,比如某种汤,你要分享它给大家。我这里有一个列表,列出了一些最有用bash别名和函数的。注意“最有用的”只是个说法,别名的是否有用要看你是否每天都需要在 shell 里面用它。

在你开始你的别名体验之旅前,这里有一个便于使用的小技巧:如果你的别名和原本的命令名字相同,你可以用如下技巧来访问原本的命令(LCTT 译注:你也可以直接原本命令的完整路径来访问它。)

\command 

例如,如果有一个替换了ls命令的别名 ls。如果你想使用原本的ls命令而不是别名,通过调用它:

\ls 

提升生产力

这些别名真的很简单并且真的很短,但他们大多数是为了给你的生命节省几秒钟,最终也许为你这一辈子节省出来几年,也许呢。

alias ls="ls --color=auto"

简单但非常重要。使ls命令带着彩色输出。

alias ll="ls --color -al"

以彩色的列表方式列出目录里面的全部文件。

alias grep='grep --color=auto'

类似,只是在grep里输出带上颜色。

mcd() { mkdir -p "$1"; cd "$1";} 

我的最爱之一。创建一个目录并进入该目录里: mcd [目录名]。

cls() { cd "$1"; ls;}

类似上一个函数,进入一个目录并列出它的的内容:cls[目录名]。

backup() { cp "$1"{,.bak};}

简单的给文件创建一个备份: backup [文件] 将会在同一个目录下创建 [文件].bak。

md5check() { md5sum "$1" | grep "$2";}

因为我讨厌通过手工比较文件的md5校验值,这个函数会计算它并进行比较:md5check文件。

alias makescript="fc -rnl | head -1 >" 

很容易用你上一个运行的命令创建一个脚本:makescript [脚本名字.sh]

alias genpasswd="strings /dev/urandom | grep -o '[[:alnum:]]' | head -n 30 | tr -d '\n'; echo" 

只是瞬间产生一个强壮的密码。

alias c="clear"

清除你终端屏幕不能更简单了吧?

alias histg="history | grep"

快速搜索你的命令输入历史:histg [关键字]

alias ..='cd ..'

回到上层目录还需要输入 cd 吗?

alias ...='cd ../..'

自然,去到上两层目录。

extract() { 
    if [ -f $1 ] ; then 
      case $1 in 
        *.tar.bz2)   tar xjf $1     ;; 
        *.tar.gz)    tar xzf $1     ;; 
        *.bz2)       bunzip2 $1     ;; 
        *.rar)       unrar e $1     ;; 
        *.gz)        gunzip $1      ;; 
        *.tar)       tar xf $1      ;; 
        *.tbz2)      tar xjf $1     ;; 
        *.tgz)       tar xzf $1     ;; 
        *.zip)       unzip $1       ;; 
        *.Z)         uncompress $1  ;; 
        *.7z)        7z x $1        ;; 
        *)     echo "'$1' cannot be extracted via extract()" ;; 
         esac 
     else 
         echo "'$1' is not a valid file" 
     fi 
}

很长,但是也是最有用的。解压任何的文档类型:extract: [压缩文件]

系统信息

想尽快地知道关于你的系统一切信息?

alias cmount="mount | column -t"

按列格式化输出mount信息。

alias tree="ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/   /' -e 's/-/|/'" 

以树形结构递归地显示目录结构。

sbs() { du -b --max-depth 1 | sort -nr | perl -pe 's{([0-9]+)}{sprintf "%.1f%s", $1>=2**30? ($1/2**30, "G"): $1>=2**20? ($1/2**20, "M"): $1>=2**10? ($1/2**10, "K"): ($1, "")}e';} 

安装文件在磁盘存储的大小排序,显示当前目录的文件列表。

alias intercept="sudo strace -ff -e trace=write -e write=1,2 -p" 

接管某个进程的标准输出和标准错误。注意你需要安装了 strace。

alias meminfo='free -m -l -t'

查看你还有剩下多少内存。

alias ps? = "ps aux | grep"

可以很容易地找到某个进程的PID:ps? [名字]。

alias volume="amixer get Master | sed '1,4 d' | cut -d [ -f 2 | cut -d ] -f 1"

显示当前音量设置。

网络

对于所有用在互联网和本地网络的命令,也有一些神奇的别名给它们。

alias websiteget="wget --random-wait -r -p -e robots=off -U mozilla"

下载整个网站:websiteget [URL]。

alias listen="lsof -P -i -n" 

显示出哪个应用程序连接到网络。

alias port='netstat -tulanp'

显示出活动的端口。

gmail() { curl -u "$1" --silent "https://mail.google.com/mail/feed/atom" | sed -e 's/<\/fullcount.*/\n/' | sed -e 's/.*fullcount>//'}

大概的显示你的谷歌邮件里未读邮件的数量:gmail [用户名]

alias ipinfo="curl ifconfig.me && curl ifconfig.me/host"

获得你的公网IP地址和主机名。

getlocation() { lynx -dump http://www.ip-adress.com/ip_tracer/?QRY=$1|grep address|egrep 'city|state|country'|awk '{print $3,$4,$5,$6,$7,$8}'|sed 's\ip address flag \\'|sed 's\My\\';} 

返回你的当前IP地址的地理位置。

也许无用

所以呢,如果一些别名并不是全都具有使用价值?它们可能仍然有趣。

kernelgraph() { lsmod | perl -e 'print "digraph \"lsmod\" {";<>;while(<>){@_=split/\s+/; print "\"$_[0]\" -> \"$_\"\n" for split/,/,$_[3]}print "}"' | dot -Tpng | display -;}

绘制内核模块依赖曲线图。需要可以查看图片。

alias busy="cat /dev/urandom | hexdump -C | grep 'ca fe'" 

在那些非技术人员的眼里你看起来是总是那么忙和神秘。

最后,这些别名和函数的很大一部分来自于我个人的.bashrc。而那些令人点赞的网站 alias.shcommandlinefu.com我早已在我的帖子best online tools for Linux 里面介绍过。你可以去看看,如果你愿意,也可以分享下你的。也欢迎你在这里评论,分享一下你的智慧。

做为奖励,这里有我提到的全部别名和函数的纯文本版本,随时可以复制粘贴到你的.bashrc。(如果你已经一行一行的复制到这里了,哈哈,你发现你又浪费了生命的几秒钟~)

#Productivity
alias ls="ls --color=auto"
alias ll="ls --color -al"
alias grep='grep --color=auto'
mcd() { mkdir -p "$1"; cd "$1";}
cls() { cd "$1"; ls;}
backup() { cp "$1"{,.bak};}
md5check() { md5sum "$1" | grep "$2";}
alias makescript="fc -rnl | head -1 >"
alias genpasswd="strings /dev/urandom | grep -o '[[:alnum:]]' | head -n 30 | tr -d '\n'; echo"
alias c="clear"
alias histg="history | grep"
alias ..='cd ..'
alias ...='cd ../..'
extract() {
    if [ -f $1 ] ; then
      case $1 in
        *.tar.bz2)   tar xjf $1     ;;
        *.tar.gz)    tar xzf $1     ;;
        *.bz2)       bunzip2 $1     ;;
        *.rar)       unrar e $1     ;;
        *.gz)        gunzip $1      ;;
        *.tar)       tar xf $1      ;;
        *.tbz2)      tar xjf $1     ;;
        *.tgz)       tar xzf $1     ;;
        *.zip)       unzip $1       ;;
        *.Z)         uncompress $1  ;;
        *.7z)        7z x $1        ;;
        *)     echo "'$1' cannot be extracted via extract()" ;;
         esac
     else
         echo "'$1' is not a valid file"
     fi
}

#System info
alias cmount="mount | column -t"
alias tree="ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/   /' -e 's/-/|/'"
sbs(){ du -b --max-depth 1 | sort -nr | perl -pe 's{([0-9]+)}{sprintf "%.1f%s", $1>=2**30? ($1/2**30, "G"): $1>=2**20? ($1/2**20, "M"): $1>=2**10? ($1/2**10, "K"): ($1, "")}e';}
alias intercept="sudo strace -ff -e trace=write -e write=1,2 -p"
alias meminfo='free -m -l -t'
alias ps?="ps aux | grep"
alias volume="amixer get Master | sed '1,4 d' | cut -d [ -f 2 | cut -d ] -f 1"

#Network
alias websiteget="wget --random-wait -r -p -e robots=off -U mozilla"
alias listen="lsof -P -i -n"
alias port='netstat -tulanp'
gmail() { curl -u "$1" --silent "https://mail.google.com/mail/feed/atom" | sed -e 's/<\/fullcount.*/\n/' | sed -e 's/.*fullcount>//'}
alias ipinfo="curl ifconfig.me && curl ifconfig.me/host"
getlocation() { lynx -dump http://www.ip-adress.com/ip_tracer/?QRY=$1|grep address|egrep 'city|state|country'|awk '{print $3,$4,$5,$6,$7,$8}'|sed 's\ip address flag \\'|sed 's\My\\';}

#Funny
kernelgraph() { lsmod | perl -e 'print "digraph \"lsmod\" {";<>;while(<>){@_=split/\s+/; print "\"$_[0]\" -> \"$_\"\n" for split/,/,$_[3]}print "}"' | dot -Tpng | display -;}
alias busy="cat /dev/urandom | hexdump -C | grep \"ca fe\""

via: http://xmodulo.com/useful-bash-aliases-functions.html

作者:Adrien Brochard 译者:luoyutiantang 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

Question:我想到SSH存在1和2两个版本(SSH1和SSH2)。这两者之间有什么不同?还有我该怎么在Linux上检查SSH协议的版本?

安全Shell(SSH)通过加密的安全通信通道来远程登录或者远程执行命令。SSH被设计来替代不安全的明文协议,如telnet、rsh和rlogin。SSH提供了大量需要的特性,如认证、加密、数据完整性、授权和转发/通道。

SSH1 vs. SSH2

SSH协议规范存在一些小版本的差异,但是有两个主要的大版本:SSH1 (版本号 1.XX) 和 SSH2 (版本号 2.00)。

事实上,SSH1和SSH2是两个完全不同互不兼容的协议。SSH2明显地提升了SSH1中的很多方面。首先,SSH是宏设计,几个不同的功能(如:认证、传输、连接)被打包进一个单一的协议,SSH2带来了比SSH1更强大的安全特性,如基于MAC的完整性检查,灵活的会话密钥更新、充分协商的加密算法、公钥证书等等。

SSH2由IETF标准化,且它的实现在业界被广泛部署和接受。由于SSH2对于SSH1的流行和加密优势,许多产品对SSH1放弃了支持。在写这篇文章的时候,OpenSSH仍旧支持SSH1和SSH2,然而在所有的现代Linux发行版中,OpenSSH服务器默认禁用了SSH1。

检查支持的SSH协议版本

方法一

如果你想检查本地OpenSSH服务器支持的SSH协议版本,你可以参考/etc/ssh/sshd\_config这个文件。用文本编辑器打开/etc/ssh/sshd\_config,并且查看"Protocol"字段。

如果如下显示,就代表服务器只支持SSH2。

Protocol 2

如果如下显示,就代表服务器同时支持SSH1和SSH2。

Protocol 1,2

方法二

如果因为OpenSSH服务其运行在远端服务器上而你不能访问/etc/ssh/sshd\_config。你可以使用叫ssh的SSH客户端来检查支持的协议。具体说来,就是强制ssh使用特定的SSH协议,接着我么查看SSH服务器的响应。

下面的命令强制ssh使用SSH1:

$ ssh -1 user@remote_server

下面的命令强制ssh使用SSH2:

$ ssh -2 user@remote_server

如果远程SSH服务器只支持SSH2,那么第一个带“-1”的选项就会出现像下面的错误信息:

Protocol major versions differ: 1 vs. 2

如果SSH服务器同时支持SSH1和SSH2,那么两个命令都有效。

方法三

另一个检查版本的方法是运行SSH扫描工具,叫做scanssh。这个命令行工具在你想要检查一组IP地址或者整个本地网络来升级SSH1兼容的SSH服务器时很有用。

下面是基本的SSH版本扫描语法。

$ sudo scanssh -s ssh -n [ports] [IP addresses or CIDR prefix] 

"-n"选项可以指定扫描的SSH端口。你可以用都好分隔来扫描多个端口,不带这个选项,scanssh会默认扫描22端口。

使用下面的命令来发现192.168.1.0/24本地网络中的SSH服务器,并检查SSH协议v版本:

$ sudo scan -s ssh 192.168.1.0/24 

如果scanssh为特定IP地址报告“SSH-1.XX-XXXX”,这暗示着相关的SSH服务器支持的最低版本是SSH1.如果远程服务器只支持SSH2,scanssh会显示“SSH-2.0-XXXX”。


via: http://ask.xmodulo.com/check-ssh-protocol-version-linux.html

译者:geekpi 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

Attic是一个Python写的删除重复数据的备份程序,其主要目标是提供一种高效安全的数据备份方式。重复数据消除技术的使用使得Attic适用于日常备份,因为它可以只存储那些修改过的数据。

Attic特性

空间高效存储

可变块大小重复数据消除技术用于减少检测到的冗余数据存储字节数量。每个文件被分割成若干可变长度组块,只有那些从没见过的组合块会被压缩并添加到仓库中。

可选数据加密

所有数据可以使用256位AES加密进行保护,并使用HMAC-SHA256验证数据完整性和真实性。

离场备份

Attic可以通过SSH将数据存储到安装有Attic的远程主机上。

备份可作为文件系统挂载

备份归档可作为用户空间文件系统挂载,用于便捷地验证和恢复备份。

安装attic到ubuntu 14.10

打开终端并运行以下命令

sudo apt-get install attic

使用Attic

手把手实例教学

在进行备份之前,首先要对仓库进行初始化:

$ attic init /somewhere/my-repository.attic

将~/src和~/Documents目录备份到名为Monday的归档:

$ attic create /somwhere/my-repository.attic::Monday ~/src ~/Documents

第二天创建一个新的名为Tuesday的归档:

$ attic create --stats /somwhere/my-repository.attic::Tuesday ~/src ~/Documents

该备份将更快些,也更小些,因为只有之前从没见过的新数据会被存储。--stats选项会让Attic输出关于新创建的归档的统计数据,比如唯一数据(不和其它归档共享)的数量:

归档名:Tuesday
归档指纹:387a5e3f9b0e792e91ce87134b0f4bfe17677d9248cb5337f3fbf3a8e157942a
开始时间: Tue Mar 25 12:00:10 2014
结束时间: Tue Mar 25 12:00:10 2014
持续时间: 0.08 seconds
文件数量: 358
        最初大小    压缩后大小  重复数据删除后大小
本归档: 57.16 MB    46.78 MB    151.67 kB
所有归档:114.02 MB  93.46 MB    44.81 MB

列出仓库中所有归档:

$ attic list /somewhere/my-repository.attic

Monday Mon Mar 24 11:59:35 2014
Tuesday Tue Mar 25 12:00:10 2014

列出Monday归档的内容:

$ attic list /somewhere/my-repository.attic::Monday

drwxr-xr-x user group 0 Jan 06 15:22 home/user/Documents
-rw-r--r-- user group 7961 Nov 17 2012 home/user/Documents/Important.doc

恢复Monday归档:

$ attic extract /somwhere/my-repository.attic::Monday

通过手动删除Monday归档恢复磁盘空间:

$ attic delete /somwhere/my-backup.attic::Monday

详情请查阅Attic文档


via: http://www.ubuntugeek.com/attic-deduplicating-backup-program.html

作者:ruchi 译者:GOLinux 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

提问: 我需要在Debian下安装特定的闭源设备驱动。然而, 我无法在Debian中找到并安装软件包。如何在Debian下安装闭源软件包?

Debian是一个拥有48,000软件包的发行版. 这些软件包被分为三类: main, contrib 和 non-free, 主要是根据许可证要求, 参照Debian开源软件指南 (DFSG)。

main软件仓库包括符合DFSG的开源软件。contrib也包括符合DFSG的开源软件,但是依赖闭源软件来编译或者执行。non-free包括不符合DFSG的、可再分发的闭源软件。main仓库被认为是Debian项目的一部分,但是contrib和non-free不是。后两者只是为了用户的方便而维护和提供。

如果你想一直能够在Debian上安装闭源软件包,你需要添加contrib和non-free软件仓库。这样做,用文本编辑器打开 /etc/apt/sources.list 添加"contrib non-free""到每个源。

下面是适用于 Debian Wheezy的 /etc/apt/sources.list 例子。

deb http://ftp.us.debian.org/debian/ wheezy main contrib non-free
deb-src http://ftp.us.debian.org/debian/ wheezy main contrib non-free

deb http://security.debian.org/ wheezy/updates main contrib non-free
deb-src http://security.debian.org/ wheezy/updates main contrib non-free

# wheezy-updates, 之前叫做 'volatile'
deb http://ftp.us.debian.org/debian/ wheezy-updates main contrib non-free
deb-src http://ftp.us.debian.org/debian/ wheezy-updates main contrib non-free

修改完源后, 运行下面命令去下载contrib和non-free软件仓库的文件索引。

$ sudo apt-get update

如果你用 aptitude, 运行下面命令。

$ sudo aptitude update

现在你在Debian上搜索和安装任何闭源软件包。


via: http://ask.xmodulo.com/install-nonfree-packages-debian.html

译者:mtunique 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

Linux系统管理员应该很熟悉CLI环境,因为通常在Linux服务器中是不安装GUI的。SSH可能是Linux系统管理员通过远程方式安全管理服务器的最流行协议。在SSH命令中内置了一种叫SCP的命令,用来在服务器之间安全传输文件。

以下命令可以解读为:用“username account”“拷贝 source file name”到“destination host”上的“destination folder”里。

SCP命令的基本语法

scp source_file_name username@destination_host:destination_folder

SCP命令有很多可以使用的参数,这里指的是每次都会用到的参数。

用-v参数来提供SCP进程的详细信息

不带参数的基本SCP命令会在后台拷贝文件,除非操作完成或者有错误出现,否则用户在界面上是看不到任何提示信息的。你可以用“-v”参数来在屏幕上打印出调试信息,这能帮助你调试连接、认证和配置的一些问题。

pungki@mint ~/Documents $ scp -v Label.pdf [email protected]:.

部分输出

Executing: program /usr/bin/ssh host 202.x.x.x, user mrarianto, command scp -v -t .
OpenSSH_6.0p1 Debian-3, OpenSSL 1.0.1c 10 May 2012
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug1: Connecting to 202.x.x.x [202.x.x.x] port 22.
debug1: Connection established.
debug1: Host '202.x.x.x' is known and matches the RSA host key.
debug1: Found key in /home/pungki/.ssh/known_hosts:1
debug1: ssh_rsa_verify: signature correct
debug1: Next authentication method: password
[email protected]'s password:
debug1: Authentication succeeded (password).
Authenticated to 202.x.x.x ([202.x.x.x]:22).
Sending file modes: C0770 3760348 Label.pdf
Sink: C0770 3760348 Label.pdf
Label.pdf 100% 3672KB 136.0KB/s 00:27
Transferred: sent 3766304, received 3000 bytes, in 65.2 seconds
Bytes per second: sent 57766.4, received 46.0
debug1: Exit status 0

从源文件获取修改时间、访问时间和模式

-p”参数会帮到把预计的时间和连接速度会显示在屏幕上。

pungki@mint ~/Documents $ scp -p Label.pdf [email protected]:.

部分输出

[email protected]'s password:
Label.pdf 100% 3672KB 126.6KB/s 00:29

用-C参数来让文件传输更快

有一个参数能让传输文件更快,就是“-C”参数,它的作用是不停压缩所传输的文件。它特别之处在于压缩是在网络传输中进行,当文件传到目标服务器时,它会变回压缩之前的原始大小。

来看看这些命令,我们使用一个93 Mb的单一文件来做例子。

pungki@mint ~/Documents $ scp -pv messages.log [email protected]:.

部分输出

Executing: program /usr/bin/ssh host 202.x.x.x, user mrarianto, command scp -v -p -t .
OpenSSH_6.0p1 Debian-3, OpenSSL 1.0.1c 10 May 2012
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug1: Connecting to 202.x.x.x [202.x.x.x] port 22.
debug1: Connection established.
debug1: identity file /home/pungki/.ssh/id_rsa type -1
debug1: Found key in /home/pungki/.ssh/known_hosts:1
debug1: ssh_rsa_verify: signature correct
debug1: Trying private key: /home/pungki/.ssh/id_rsa
debug1: Next authentication method: password
[email protected]'s password:
debug1: Authentication succeeded (password).
Authenticated to 202.x.x.x ([202.x.x.x]:22).
debug1: Sending command: scp -v -p -t .
File mtime 1323853868 atime 1380425711
Sending file timestamps: T1323853868 0 1380425711 0
messages.log 100% 93MB 58.6KB/s 27:05
Transferred: sent 97614832, received 25976 bytes, in 1661.3 seconds
Bytes per second: sent 58758.4, received 15.6
debug1: Exit status 0

不用“-C”参数来拷贝文件,结果用了1661.3秒,你可以比较下用了“-C”参数之后的结果。

pungki@mint ~/Documents $ scp -Cpv messages.log [email protected]:.

部分输出

Executing: program /usr/bin/ssh host 202.x.x.x, user mrarianto, command scp -v -p -t .
OpenSSH_6.0p1 Debian-3, OpenSSL 1.0.1c 10 May 2012
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug1: Connecting to 202.x.x.x [202.x.x.x] port 22.
debug1: Connection established.
debug1: identity file /home/pungki/.ssh/id_rsa type -1
debug1: Host '202.x.x.x' is known and matches the RSA host key.
debug1: Found key in /home/pungki/.ssh/known_hosts:1
debug1: ssh_rsa_verify: signature correct
debug1: Next authentication method: publickey
debug1: Trying private key: /home/pungki/.ssh/id_rsa
debug1: Next authentication method: password
[email protected]'s password:
debug1: Enabling compression at level 6.
debug1: Authentication succeeded (password).
Authenticated to 202.x.x.x ([202.x.x.x]:22).
debug1: channel 0: new [client-session]
debug1: Sending command: scp -v -p -t .
File mtime 1323853868 atime 1380428748
Sending file timestamps: T1323853868 0 1380428748 0
Sink: T1323853868 0 1380428748 0
Sending file modes: C0600 97517300 messages.log
messages.log 100% 93MB 602.7KB/s 02:38
Transferred: sent 8905840, received 15768 bytes, in 162.5 seconds
Bytes per second: sent 54813.9, received 97.0
debug1: Exit status 0
debug1: compress outgoing: raw data 97571111, compressed 8806191, factor 0.09
debug1: compress incoming: raw data 7885, compressed 3821, factor 0.48

看到了吧,压缩了文件之后,传输过程在162.5秒内就完成了,速度是不用“-C”参数的10倍。如果你要通过网络拷贝很多份文件,那么“-C”参数能帮你节省掉很多时间。

有一点我们需要注意,这个压缩的方法不是适用于所有文件。当源文件已经被压缩过了,那就没办法再压缩很多了。诸如那些像.zip.rarpictures.iso的文件,用“-C”参数就没什么意义。

选择其它加密算法来加密文件

SCP默认是用“AES-128”加密算法来加密传输的。如果你想要改用其它加密算法来加密传输,你可以用“-c”参数。我们来瞧瞧。

pungki@mint ~/Documents $ scp -c 3des Label.pdf [email protected]:.

[email protected]'s password:
Label.pdf 100% 3672KB 282.5KB/s 00:13

上述命令是告诉SCP3des algorithm来加密文件。要注意这个参数是“-c”(小写)而不是“-C“(大写)。

限制带宽使用

还有一个很有用的参数是“-l”参数,它能限制使用带宽。如果你为了拷贝很多文件而去执行了一份自动化脚本又不希望带宽被SCP进程耗尽,那这个参数会非常管用。

pungki@mint ~/Documents $ scp -l 400 Label.pdf [email protected]:.

[email protected]'s password:
Label.pdf 100% 3672KB 50.3KB/s 01:13

在“-l”参数后面的这个400值意思是我们给SCP进程限制了带宽为50 KB/秒。有一点要记住,带宽是以千比特/秒 (kbps)表示的,而8 比特等于1 字节

因为SCP是用千字节/秒 (KB/s)计算的,所以如果你想要限制SCP的最大带宽只有50 KB/s,你就需要设置成50 x 8 = 400

指定端口

通常SCP是把22作为默认端口。但是为了安全起见SSH 监听端口改成其它端口。比如说,我们想用2249端口,这种情况下就要指定端口。命令如下所示。

pungki@mint ~/Documents $ scp -P 2249 Label.pdf [email protected]:.

[email protected]'s password:
Label.pdf 100% 3672KB 262.3KB/s 00:14

确认一下写的是大写字母“P”而不是“p“,因为“p”已经被用来保留源文件的修改时间和模式(LCTT 译注:和 ssh 命令不同了)。

递归拷贝文件和文件夹

有时我们需要拷贝文件夹及其内部的所有文件/子文件夹,我们如果能用一条命令解决问题那就更好了。SCP用“-r”参数就能做到。

pungki@mint ~/Documents $ scp -r documents [email protected]:.

[email protected]'s password:
Label.pdf 100% 3672KB 282.5KB/s 00:13
scp.txt 100% 10KB 9.8KB/s 00:00

拷贝完成后,你会在目标服务器中找到一个名为“documents”的文件夹,其中就是所拷贝的所有文件。“documents”是系统自动创建的文件夹。

禁用进度条和警告/诊断信息

如果你不想从SCP中看到进度条和警告/诊断信息,你可以用“-q”参数来静默它们,举例如下。

pungki@mint ~/Documents $ scp -q Label.pdf [email protected]:.

[email protected]'s password:
pungki@mint ~/Documents $

正如你所看到的,在你输入密码之后,没有任何关于SCP进度的消息反馈。进度完成后,你也看不到任何提示。

用SCP通过代理来拷贝文件

代理服务器经常用于办公环境,SCP自然是没有经过代理方面的配置的。当你的环境正在使用代理,那么你就必须要“告诉”SCP与代理关联起来。

场景如下:代理的地址是10.0.96.6,端口是8080。该代理还实现了用户认证功能。首先,你需要创建一个“~/.ssh/config”文件,其次把以下命令输入进该文件。

ProxyCommand /usr/bin/corkscrew 10.0.96.6 8080 %h %p ~/.ssh/proxyauth

接着你需要创建一个同样包括以下命令的“~/.ssh/proxyauth”文件。

myusername:mypassword

然后你就可以像往常一样使用SCP了。

请注意corkscrew可能还没有安装在你的系统中。在我的Linux Mint中,我需要首先先用标准Linux Mint安装程序来安装它。

$ apt-get install corkscrew

对于其它的一些基于yum安装的系统,用户能用以下的命令来安装corkscrew。

# yum install corkscrew

还有一点就是因为“~/.ssh/proxyauth”文件中以明文的格式包含了你的“用户名”和“密码”,所以请确保该文件只能你来查看。

选择不同的ssh\_config文件

对于经常在公司网络和公共网络之间切换的移动用户来说,一直改变SCP的设置显然是很痛苦的。如果我们能放一个保存不同配置的ssh\_config文件来匹配我们的需求那就很好了。

以下是一个简单的场景

代理是被用来在公司网络但不是公共网络并且你会定期切换网络时候使用的。

pungki@mint ~/Documents $ scp -F /home/pungki/proxy_ssh_config Label.pdf

[email protected]:.
[email protected]'s password:
Label.pdf 100% 3672KB 282.5KB/s 00:13

默认情况下每个用户会把“ssh\_config”文件放在“~/.ssh/config“路径下。用兼容的代理创建一个特定的“ssh\_config”文件,能让你切换网络时更加方便容易。

当你处于公司网络时,你可以用“-F”参数,当你处于公共网络时,你可以忽略掉“-F”参数。

以上就是关于SCP的全部内容了,你可以查看SCPman页面来获取更多内容,请随意留下您的评论及建议。


via: http://www.tecmint.com/scp-commands-examples/

作者:Pungki Arianto 译者:ZTinoZ 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出