diff แตกต่างจาก ssh อย่างไร


175

ฉันจะกระจายไฟล์ / โฟลเดอร์ต่าง ๆ ในเครื่องต่าง ๆ ได้อย่างไรโดยมีเพียงการเชื่อมต่อที่ใช้ได้เท่านั้นคือ ssh


8
มีคำถามที่ค่อนข้างคล้ายกันที่# 16661: ฉันจะกระจายเซิร์ฟเวอร์ RedHat Linux สองตัวได้อย่างไร . คำตอบที่นั่นเพื่อบันทึกการคลิกคือrsync -ani --delete / root@remotehost:/แต่คำตอบทั้งหมดให้รายละเอียดมากขึ้น
Owen Blacker

ค่อนข้างคำตอบมากมายที่นี่ แต่วิธีใดเร็วกว่ากัน
pl1nk

1
ไม่มีใครใช้เครื่องมือ diff ภาพ ?
Dan Dascalescu

คำตอบ:


150

คุณสามารถทำได้ด้วยการทดแทนกระบวนการของ Bash :

 diff foo <(ssh myServer 'cat foo')

หรือถ้าทั้งคู่อยู่บนเซิร์ฟเวอร์ระยะไกล:

diff <(ssh myServer1 'cat foo') <(ssh myServer2 'cat foo')

12
ใช่บางอย่างเช่นนี้ แต่สำหรับไดเรกทอรี :)
Alexey Timanovsky

หมายความว่าไงไดเรกทอรีเสมอสามารถใช้ทดแทนแมว LS
ไคล์ Brandt

27
ฉันสงสัยว่า 'สำหรับไดเรกทอรี' หมายถึงการทำซ้ำแบบซ้ำ
Ian Clelland

9
ฉันพบว่าเทคนิคนี้ใช้ไม่ได้สำหรับฉันหากโฮสต์ระยะไกลของฉันต้องการรหัสผ่าน ดูเหมือนว่ารหัสผ่านไม่ทำงานได้ดีกับการเปลี่ยนเส้นทางและไม่สามารถดำเนินการให้เสร็จสมบูรณ์ หากคุณใช้คีย์ ssh สิ่งนี้จะไม่เป็นปัญหา
Adam Franco

2
นี่เป็นวิธีแก้ไขปัญหาทั่วไปที่ยอดเยี่ยมสำหรับปัญหามากมาย แทนที่จะเป็น 'cat foo' คุณสามารถใช้ 'find / foo / bar -type f | ในขณะที่อ่านไฟล์ ทำเสียงสะท้อน "**** $ file"; cat "$ file"; เสร็จสิ้น 'และคุณจะมีรายการชื่อไฟล์และเนื้อหาไฟล์ที่จะแตกต่างกัน
พอลเกียร์

106

ในที่สุดฉันก็พบทางออกที่ดี: vimdiff

vimdiff /path/to/file scp://remotehost//path/to/file

ขอบคุณที่http://linux.spiney.org/remote_diff_with_vim_and_ssh เห็นhttp://www.vim.org/scripts/script.php?script_id=1075


7
สิ่งที่เกี่ยวกับไดเรกทอรี? :)
Perlnika

1
นี่คือตัวอย่าง: vimdiff .bash_profile scp: //vaibhavc@10.217.212.97//home/vaibhavc/.bash_profile
vaichidrewar

4
2 ทับ//หลังจากที่remotehostสำคัญ เครื่องหมายทับเดี่ยวจะไม่ทำงาน
Lee Chee Kiam

2
หากคุณมีชื่อผู้ใช้ที่แตกต่างกันในโฮสต์ระยะไกลกว่าโฮสต์ปัจจุบันของคุณคุณจะใช้vimdiff /path/to/file scp://username@remotehost//path/to/file
JaredC

คุณจะทำสิ่งนี้กับสองรีโมตโฮสต์ที่มีไฟล์คีย์ id_rsa @JaredC ได้อย่างไร
Manatax

61

หากคุณเพียงต้องการดูว่าไฟล์ใดแตกต่างกันไปแทนที่จะเป็นส่วนต่างของไฟล์จริงคุณสามารถใช้ rsync --dry-run


10
rsync -n เป็นเวอร์ชั่นสั้น
volni

ยอดเยี่ยม - ถ้าคุณต้องการใช้พอร์ตอื่นให้ใช้ rsync -e "ssh -p 2222" <SRC> <DST>
Samoth

16

นี่คือสูตรบรรทัดคำสั่งอื่นที่รวดเร็วและสกปรก ต่างจากคำตอบที่เลือกมันใช้งานได้ภายใน makefiles:

ssh [login]@[host] "cat [remote file]" | diff - "[local file]"

หากการแก้ไขของฉันไม่ผ่าน: วิธีนี้เหนือกว่าคำตอบที่เลือกเพราะทำงานได้กับ makefiles
Chris Redford

@ Steve Dickinson - คุณหมายถึงอะไร "มันใช้งานได้ภายใน makefiles"?
Martin Vegter

1
นี่เป็นทางเลือกที่ดีถ้าคุณเป็นโรคภูมิแพ้เหมือนฉัน :) ฉันสร้างสคริปต์ทุบตีที่เปรียบเทียบไฟล์เดียวกันกับโฮสต์ที่แตกต่างกันสองแห่งมีประโยชน์เมื่อโอนย้ายบริการระหว่างเครื่องและเปรียบเทียบไฟล์กำหนดค่า ดูgist.github.com/jhqv/dbd59f5838ae8c83f736bfe951bd80ff
Janek

10

ใช้ scp เพื่อนำไฟล์ไปยังเครื่องทั่วไปและแตกต่างกันที่นั่นหรือไม่

หรือถ้าคุณเพียงต้องการที่จะทราบว่าไฟล์ที่มีความแตกต่างกันหรือไม่สับพวกเขาด้วย md5sum ในแต่ละเครื่อง

คุณสามารถดูบางอย่างเช่นSSHFSได้ แต่ฉันไม่รู้ว่าอัลกอริทึมอย่าง diff แตกต่างกันอย่างไร


2
rsync --dry-runเป็นวิธีที่ง่ายเพื่อดูว่าไฟล์ที่แตกต่างกันหรือไม่นั้น
เจอรัลด์รวงผึ้ง

ฉันลืมเกี่ยวกับ SSHFS นี้ทำงานที่ดีสำหรับฉัน ...
Arod

7

วิธีการหนึ่งที่ถ้ามันเป็นไปได้ในระบบของคุณจะเป็นเพียงแค่ติดตั้งระบบแฟ้มระยะไกลด้วยsshfs


diff มักเป็นการกระทำแบบ one-shot เช่นต้องการตรวจสอบความแตกต่างของ config การติดตั้งระบบไฟล์ในแต่ละครั้งเป็นไปได้ แต่ไม่สะดวก ฉันควรน้ำมันดินและ SCP
Alexey Timanovsky

3

คุณสามารถใช้rsyncในโหมดแห้งเป็นเวลาสั้น ๆ ข้อเสนอแนะในคำตอบอื่น มันแสดงรายการไฟล์ใด ๆ ที่แตกต่างกัน

สำหรับสิ่งนั้นให้ใช้rvncตัวเลือก ( r= recursive, v= verbose, n= dry-run, c= checksum) ด้วยrsyncin pull mode ( rsync [OPTION...] [USER@]HOST:SRC... [DEST]) ตัวอย่างคือ:

rsync -rvnc root@182.18.158.207:/var/www/html/dev/ .

โปรดจำไว้ว่านี่ไม่มีข้อมูลว่าไฟล์ภายในเครื่องหรือไฟล์ระยะไกลนั้นใหม่กว่า เพียงแค่ถ้าพวกเขาแตกต่างกัน


2
  • บนเครื่องโลคอลของคุณให้ทำสำเนาของไดเร็กตอรี่ที่คุณต้องการกระจายซ้ำ ตัวอย่างเช่น

    cp -R dir replica
    
  • ใช้ rsync เพื่อทำซ้ำไดเรกทอรีระยะไกลบนสำเนาโลคัล:

     rsync remote:/path/to/dir replica
    
  • ใช้ diff เพื่อค้นหาความแตกต่างระหว่างโลคัลไดเร็กทอรีและเรพลิกาแบบโลคัลของรีโมตหนึ่ง:

    diff dir replica
    

2

หากคุณมี sshfs และจำเป็นต้องกระจายไดเรกทอรี:

mkdir remote_path
sshfs user@host:/path/ remote_path
diff -r path remote_path

1

นี่คือวิธีที่ฉันทำ

ฉันใช้ SFTP ไปยังเซิร์ฟเวอร์ระยะไกลและป้อนชื่อผู้ใช้ / pwd ของฉันเมื่อได้รับแจ้ง จากนั้นฉันใช้ dir ที่สร้างขึ้นใน. gvfs dir ในโฮมไดเร็กตอรี่ของฉันในคำสั่ง diff

diff -r - สรุป / home / user dir / .gvfs / SFTP \ on \ freenas.local / พา ธ ไปยัง dir / dir1 / พา ธ ไปยัง local dir / dir2


1

นี่คือสคริปต์ที่สามารถช่วยในการกระจายโฟลเดอร์ท้องถิ่นและโฟลเดอร์ระยะไกล:

 #!/bin/bash

 LOCALFOLDER=/var/www/tee
 REMOTEFOLDER=$(ssh root@111.111.111.1 'ls -lA /hfs/tee'| grep -E '^total' | cut -d " " -f 2 > remotessh.txt)
 COMMAND=$(ls -lA $LOCALFOLDER | grep -E '^total' | cut -d " " -f 2 > localssh.txt)
 REM=$(cat remotessh.txt)
 LOCAL=$(cat localssh.txt)

 echo $LOCAL
 echo $REM

 if [ $REM -eq $LOCAL ]
 then
      echo Directories are the same
 else
      echo Directories are differnt
 fi

 #diff localssh.txt remotessh.txt | grep -E '^total' | cut -d " " -f 2


1

ใช้sshfsติดตั้งข้าม ssh มันจะไม่เร็วขนาดนั้นทั้งหมด แต่คุณสามารถใช้ชุดเครื่องมือแบบเต็มซึ่งคาดว่าทุกอย่างจะอยู่ในระบบไฟล์ภายในเครื่อง อีกทางเลือกหนึ่งคือ NFS เหนืออุโมงค์ที่ทำด้วย "ssh -w" (หรือการสื่อสารอื่น ๆ ที่ ssh ไม่ได้มีข้อ จำกัด )


1

คุณยังสามารถลองใช้แนวทางทั่วไปโดยสร้างฟังก์ชัน bash ซึ่งอาจเป็นใน ~ / .bashrc ของคุณ:

myrdiff() { ssh root@"$1" cat "$2" | diff -s - "$2" ; }

จากนั้นเรียกใช้ด้วยโครงสร้างเช่น:

myrdiff vm20-x86-64 /etc/gdm/Init/Default

ด้วยการเรียกใช้ diff กับ -s สิ่งนี้จะรายงานว่าไฟล์เหมือนกันหรือไม่

ไชโย! จิม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.