ssh에 대한 차이점은 무엇입니까?


175

사용 가능한 유일한 연결이 ssh 인 경우 여러 시스템에서 파일 / 폴더를 어떻게 비교합니까?


8
# 16661 에는 비교적 비슷한 질문이 있습니다. 두 개의 RedHat Linux 서버를 어떻게 구별 할 수 있습니까? . 누르기를 저장이 대답은, 인 rsync -ani --delete / root@remotehost:/을 제외한 전체 대답은 자세한 내용을 제공합니다.
Owen Blacker

여기에 많은 답변이 있지만 어떤 접근법이 더 빠릅니까?
pl1nk

1
아무도 시각적 차이 도구를 사용하지 않습니까?
Dan Dascalescu

답변:


150

Bash의 프로세스 대체로 수행 할 수 있습니다 .

 diff foo <(ssh myServer 'cat foo')

또는 둘 다 원격 서버에있는 경우 :

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

12
그래, 이와 같은 것이지만 디렉토리를 위해 :)
Alexey Timanovsky

디렉토리를 어떻게 의미합니까, 항상 cat을 ls로 바꿀 수 있습니다
Kyle Brandt

27
그 재귀 사랑하는 일을 수단 '디렉토리에'의심
이안 Clelland

9
원격 호스트에 암호가 필요한 경우이 기술이 작동하지 않는 것으로 나타났습니다. 비밀번호 프롬프트가 리디렉션에서 제대로 작동하지 않아서 성공적으로 완료 할 수 없습니다. ssh 키를 사용하면 문제가되지 않습니다.
Adam Franco

2
이것은 많은 문제에 대한 훌륭한 일반적인 해결책입니다. 'cat foo'대신 'find / foo / bar -type f | 파일을 읽는 동안; echo "**** $ file"; 고양이 "$ file"; 완료 '하고 파일 이름과 diff 할 파일 내용의 목록이 있습니다.
Paul Gear

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

여기에 또 다른 빠르고 더러운 명령 행 레시피가 있습니다. 선택한 답변과 달리 makefile 내에서 작동합니다.

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

내 편집이 진행되지 않으면이 방법은 makefile과 함께 작동하기 때문에 선택한 답변보다 우수합니다.
Chris Redford

@Steve Dickinson- "makefiles 내부에서 작동"이란 무엇입니까?
Martin Vegter

1
나 같은 vim 알레르기로 고통 받고 있다면 이것은 좋은 해결책입니다. :) 나는 두 개의 다른 호스트에서 동일한 파일을 비교하는 bash 스크립트를 만들었습니다. 이는 컴퓨터간에 서비스를 마이그레이션하고 구성 파일을 비교할 때 유용합니다. 참조 gist.github.com/jhqv/dbd59f5838ae8c83f736bfe951bd80ff
Janek

10

scp를 사용하여 파일을 일반 컴퓨터로 가져 와서 다른 곳으로 옮깁니 까?

또는 파일 다른지 여부를 알고 싶다면 각 시스템에서 md5sum으로 해시하십시오.

SSHFS 와 같은 것을 살펴볼 수도 있지만 diff와 같은 알고리즘이 그 기능을 얼마나 잘 수행하는지 모르겠습니다.


2
파일이 다른지 여부를 확인하는 더 쉬운 방법은 rsync --dry-run입니다.
Gerald Combs

나는 SSHFS에 대해 잊었다. 이것은 나를 위해 훌륭하게 작동했습니다 ...
arod

7

한 가지 방법은 시스템에서 가능한 경우 sshfs로 원격 파일 시스템을 마운트하는 것 입니다.


diff는 일반적으로 구성 차이를 확인하는 것과 같은 원샷 작업입니다. 매번 파일 시스템을 마운트하는 것이 가능하지만 확실하지는 않습니다. 나는 tar와 scp가 더 낫다.
Alexey Timanovsky

3

다른 답변rsync 에서 간략히 제안한대로 드라이 런 모드에서 사용할 수 있습니다 . 다른 파일을 나열합니다.

이를 위해 rvnc옵션 ( r= recursive, v= verbose, n= dry-run, c= checksum)을 사용하십시오. 함께 rsync풀 모드 (에 rsync [OPTION...] [USER@]HOST:SRC... [DEST]), 예이다 :

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

기억 이 로컬 또는 원격 파일이 최신 여부에 아무런 정보를 제공하지 않습니다. 그들이 다른 경우에만.


2
  • 로컬 시스템에서 diff하려는 디렉토리의 재귀 사본을 작성하십시오. 예를 들어 :

    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를 원격 서버에 사용하고 메시지가 표시되면 사용자 이름 / 암호를 입력했습니다. 그런 다음 diff 명령으로 내 홈 디렉토리의 .gvfs 디렉토리에 작성된 디렉토리를 사용했습니다.

diff -r --brief / 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

ssh에 마운트 된 sshfs를 사용하십시오 . 그렇게 빠르지는 않지만 모든 것이 로컬 파일 시스템에있을 것으로 기대하는 전체 도구 모음을 사용할 수 있습니다. 대안은 "ssh -w"(또는 ssh가 제한되지 않는 다른 통신)로 만들어진 터널을 통한 NFS입니다.


1

~ / .bashrc에서 bash 함수를 만들어 접근 방식을 일반화 할 수도 있습니다.

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

그런 다음 다음과 같은 구문으로 호출하십시오.

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

-s를 사용하여 diff를 호출하면 파일이 동일한 지보고합니다.

건배! 짐

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.