2014-01-16

轉貼--ssh tar 命令把遠端檔拉回來或推過去

轉貼 http://zoomq.qiniudn.com/ZQScrapBook/ZqFLOSS/data/20101215175709/
如有違版權,通知後立即刪除

在Linux下,通常可透過scp/tar+ssh/rsync處理異機備份的動作。
本文對tar+ssh實作說明簡明,故留存之.


ssh tar 命令把遠端檔拉回來或推過去
 *************************************************************

登錄22tar 壓縮/var/log目錄輸出到標準輸入通過管道傳到本地22_log.tar.gz文件
ssh 192.168.0.22 "cd /var ;tar -zcvf - log"|cat >22_log.tar.gz


在提取存檔檔時,會在相對位置重新創建檔。
可以使用這種方法説明同步目錄。
因為 tar 創建目錄結構的位元組流,可以通過結合使用 tar 和管道把檔從一個位置複製到另一個位置:
$ tar cf - ./etc |( cd /backup; tar xf - )
-” 指定 tar 應該使用標準輸出(在寫時)或標準輸入(在讀時)。
圓括號讓語句在一個子 shell 中執行。


看一下管道符前面的代碼,它創建檔的位元組流並發送到標準輸出。
在管道符後面,切換到另一個目錄,然後從標準輸入提取位元組流。
    要想保留檔的所有者和許可權,可以使用 p 選項保留每個檔和目錄的中繼資料:
$ tar cfp - ./etc |( cd /backup; tar xfp - )

    掌握這種基本結構之後,就可以執行更複雜的操作。例如,可以只複製在特定時間之後修改過的檔:
$ tar cf - --newer 20090101 ./etc |(cd /backup; tar xf - )
這個命令創建在 2009 1 1 日之後修改過的檔的拷貝。

    通過與 rsh ssh 結合使用,還可以把檔同步到遠端主機:
$ tar cfp - ./etc |(ssh user@host -- tar xfp -)

按照這種方式使用 ssh tar 是在遠端主機上創建本地檔案備份的好方法。

但是,還有更高效的資訊同步方法。

1、在A機壓縮後,複製到B機器並解壓縮
tar -cf - /opt/dir1 | ssh 192.168.0.116 "cd /opt; tar -xf -"

2、在A機壓縮,並將壓縮檔複製到B
tar -cf - /opt/dir1 | ssh 192.168.0.116 "cd /opt; cat - > dir1.tar"

3、將A機的壓縮檔,複製到B機並解壓縮
zcat dir.tar | ssh 192.168.0.116 "cd /opt; tar -xf -"

傳輸到遠端:tar czf - file| ssh server "tar zxf -"

壓縮到遠程:tar czf - file| ssh server "cat > file.tar.gz"

解壓到遠程:ssh server "tar zxf -" < file.tar.gz

解壓到本地:ssh server "cat file.tar.gz" | tar zxf -

-----------------------------------------------------------------

$target 表示目的機器,指遠端機器
$backup_server 表示備份機器,同樣也是指遠端機器
$save 則是指備份目錄

要求遠端備份並拉回 local
ssh $target tar -cf - / --exclude /mnt | bzip2 -9 | cat > $target.tar.bz2

解開本地備份並回存到遠端去
bunzip2 -dc $target.tar.bz2 | ssh $target "cd /;tar -pxkf -"

備份 local 資料,丟到遠端去壓縮並存檔
tar cf - / --exclude xxx | ssh $backup_server "bzip2 -9 > $save/test.tar.bz2"

把遠端資料拉回 local,作解壓縮動作
ssh $backup_server "cat $save/test.tar.bz2" | bunzip2 | tar -xpkf -





在本地腳本放在遠端執行

cat myscript.sh | ssh kramer /bin/sh
hostname
date
w
ifconfig
ps -ef | grep http | awk '{print $NF}'

在遠端較長的管道命令(這個同樣可以用上面的腳本方式執行)
#! /bin/sh
ssh 172.16.1.2 <
   sa=`/usr/sbin/alternatives --config java 2>&1`
   echo "Result:"
   echo "$sa"
   echo
   echo "Will I find anything when I look in that result for jdk1.6.0_05 ???"
   echo "$sa" | grep "jdk1.6.0_05"
   echo "Nope. I thought not! But the reason should be clear now!"
EOF

ssh技巧


遠端比較文件
ssh remote-hosts cat memos/memo.draft | diff memos.new -
cat memos.new | ssh speedy diff - memos/memo.draft#diff <(ssh -n george cat /etc/passwd) <(ssh -n kramer cat /etc/passwd)


打包檔並直接傳遞到遠端目錄解開(不在本地生成檔)
tar cf - some_directory | ssh kramer "( cd /path/to/destination; tar xf - )"

ssh 192.168.100.166 tar -cf - /var/www/html/centos/5/repodata |cat > tt.tar
ssh 192.168.10.145 tar -czf - '--exclude=*.gz' '--exclude=*.tgz' '--exclude=*.tar' /a8root/phpweb/website/images
直接獲取遠端檔tar並在本地保留

ssh 192.168.100.166 "find /var/www/html/centos/5/repodata -depth -print | cpio -oaV" | cat > tt.cpio

沒有留言:

張貼留言

Related Posts Plugin for WordPress, Blogger...