Posts Tagged ‘between’

How to do Diff (compare files) over SSH between local and remote servers on Linux

Monday, December 16th, 2019

how-to-diff-files-between-remote-servers-and-local-machines-on-linux

In system administration often we need to compare files located on a different servers, copying the files from Server A to Server B is easy to do but is time consuming as you have use some console ftp or sftp client scp or sftp to copy the files from server A to server B and then use diff command on one of the both systems.

Thanksfully there are other ways to do so by using simply one liner of diff + ssh or rsync + ssh and even for the vim lovers there is vimdiff.
In this short article I'll give few examples on quick ways to compare files between 2 Servers via SSH Protocol.

 

1.  Compare files for differences on 2 Linux servers via SSH protocol

 

Assuming you're logged on first server where certain config is located and you want to compare with a remote server via ssh.

 

 diff local-file <(ssh myServer 'cat remote-file')

 

If you're on a server and you want to compare file configurations between 2 remote servers both running ssh, generally you need something like:

 

diff <(ssh myServer1 'cat /etc/ssh/sshd_config') <(ssh myServer2 'cat /etc/ssh/sshd_config')​

 

To compare multiple files in directories with diff
 

diff <(/usr/bin/ssh user1@192.168.122.1 'ls /opt/lib/') <(/usr/bin/ssh user2@192.168.122.1 'ls /tmp/') | grep -i ">" | sed 's/> //g'

 

2. Interactively check 2 or more config files and show differences in a vim text editor style

 

vimdiff package is not installed across all Linux distributions so on paranoid Security tightened Linux environments, but on most servers should be either there or could be installed with apt / yum whatever package manager. You will need vimdiff installed only on one of the Nth servers you want to check config.

Here is how to compare 3 Linux servers, running OpenSSHD services existing files in vimdiff

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


vimdiff-with-3-servers-comparing-sshd-config-file

Note here that the double slash – // syntax is mandatory without it vimdiff will return files. Also be aware that the files you want to check should be present on each of the server directory locations, otherwise you will end up with weird errors.

vimdiff is the Mercedes of comparison especially for VIM UNIX addicts and due to its nice coloring makes reading, the difference between server files very easy.

3. File comparison with diff or vimdiff via SSHFS mount

mkdir remote_path
sshfs user@hostname:/dir/ remote_path
diff -r local_path/file remote_path/file

4. Comparing files with diff by printing local and remote server files with diff

Most servers doesn't have sshfs by default and for servers following PCI High Security standards, there are other means to compare files on both or more hosts in a minimalistic way, here is idea how:
 

diff <(ssh remote-host-server find /var/www -printf '"%8s %P\n"') \
     <(find /var/www -printf '%8s %P\n')

5. Comparing files content on local and remote server directory with rsync

The best UNIX tool to compare mutliple files and directory across Local remote servers and a mixture of both is our lovely rsync 
together wtih SSH, ssh compes with the –-dry-run (-n) – test what rsync will do option.

To compare files over SSH protocol with rsync on local and remote server

rsync -rvnc root@10.10.10.50:/var/www/html/phpcode /var/www/html/phpcode


To compare 2 remote hosts:

rsync -rvnc root@187.50.200.73:/var/www/html/phpcode/ root@192.168.5.50:/var/www/html/phpcode 


To compare more hosts even a mixture of local and remote servers do.

rsync -rvnc root@187.50.200.73:/var/www/html/phpcode/  \
root@192.168.5.50:/var/www/html/phpcode  \
root@192.168.5.70:/var/www/html/phpcode \
./var/www/html/phpcode

The rsync options given are as so:

r=recursive,
v=verbose,
n= dry-run,
c=checksum

How to Share virtual terminal SSH between mutliple logged in users with screen / Create multi user sessions with GNU screen

Friday, November 2nd, 2012

How to share bash shell between multiple users with gnu screen - share virtual terminal via ssh  through multiple users screen

GNU Screen is great utility with a number of helpful features. Maybe there is no UNIX / (GNU / Linux),  admin which doesn't use screen or some similar terminal emulator prog. daily basis.

Little might know however abut a kewl functionality allowing, a few logged in users via ssh to share one terminal.

Sharing a virtual terminal with another person, is very helpful if you want to teach someone a bit of Linux / UNIX basics, showing him how certain commands works on a system etc. etc.

Shared terminal session is very helpful in case of need for remote system administration or support, whether instead of explaining someone over the phone for 20 minutes or an hour a bunch of commands he has to run to achieve something,  you can login share terminal with screen and do whatever necessary  in front of his eyes.

Shared screen session, can actually in theory allow unlimited people to watch what a certain one is doing in a his virtual terminal. This is very helpful for example in Computer Laboratories for Teachers to teach students FreeBSD, Linux, bash, csh shell scripting, perl or whatever programming language taught.

Allowing two or more logged in users with same user credentialsto use screen can be done pretty easy, one primary user (creating the initial screen terminal session), should just launch GNU screen:

test@noah:~$ screen

The second, third, 4th, 5th and the rest of users should login via SSH session with same user, lets say test and launch screen -x

test@noah:~$ screen -list
There is a screen on:
    20147.pts-5.noah    ( 1.11.2012 18,27,50)    (Attached)
1 Socket in /var/run/screen/S-hipo.

 

test@noah:~$ screen -x

I'm not sure if screen has some kind of limitation on how many users maximum can connect to a screen session, but I guess it should be high enough for dozen of people –  at least 512 or 1024 people to connect and share one shell simultaneously.

In some Linux distributions (versions) RHEL, CentOS it is possible screen -x not to work out of the box, because screen binary is not set to be SUID.
On latest Debian versions and deb derivatives thanksfully, screen bin is by default installed as SUID so screen -x works fine.

hipo@noah:~$ ls -al /usr/bin/screen
-rwxr-sr-x 1 root utmp 364088 29 юли  2009 /usr/bin/screen

Enabling mutiuser screen login via a running screen session is possible by pressing:

CTRL + a + : and typing in prompt  multiuser on

In case you want to have a system user which by default allows a multiple logged in users to share shell you can use a little 'hack' just change in /etc/passwd the field recordfor user shell (/bin/bash) with (/usr/bin/screen)

Lets say you want to allow the user test support multiple logged in users share one shell the record for test in /etc/passwd should look smth. like:

test:x:1003:1004:,,,:/home/test:/bin/bash

Change it with your favourite text editor to:

test:x:1003:1004:,,,:/home/test:/usr/bin/screen

If you have some problems running screen, check permissions and eventually exec as superuser:

chmod u+s /usr/bin/screen


Enable write “write” command between logged in users on Debian GNU / Linux

Tuesday, October 9th, 2012

efault Debian GNU / Linux install does not permit messaging between ssh logged in users. Messages are disabled like this for security reasons as if they are on by default it is quite easy to flood one’s terminal with messages using a little loop like for instance:


while [ 1 ]; do
echo "You're flooded" | mesg username
done

Hence smartly, all users between write is switched off, i.e. mesg n

For those unfamiliar with mesg I suggest you check man mesg – which is one of the shortest UNIX manual written 🙂

Mesg head manual description is:


mesg - control write access to your terminal

Options mesg can accept are either yes or no ( y / n ).
To check on current logged in user if write username messaging is turned on, on any logged in user shell use:


# mesg
mesg is n

While mesg is set to no by default, if you try to message a random logged in system user you will get a message like:


$ write testuser
write: write: you have write permission turned off.

It is actually, quite handy to have messages switched on especially if you have a Linux host with user accounts which are friends of yours and
it is not very likely mesg is used for bad.

To change the default mesg n to mesg y you need to edit /etc/bash.bashscr (in case if all users are configured to use bash) or even better to set mesg y for all existing users add a new line on top or at the end of /etc/profile file:


echo 'mesg y' >> /etc/profile

On next login via ssh or physical tty, messaging will be on. To check re-login and type:


$ mesg
is y

One note to make here, is even though if you set messaging to yes for all users via /etc/profile, still for some reason the root user m
essaging keeps set to NO.


$ mesg
is y

One note to make here, is even though if you set messaging to yes for all users via /etc/profile, still for some reason the root user m
essaging keeps set to NO.


root@debian:~# mesg
is n

I have no clue, like this happens, but if you need to enable mesg to root as well add mesg y to /root/.bashrc

Well that’s all, I hope this helps someone 🙂 Cheers.