3. Networking: ssh
-
Another network tool is
ssh
, which can be used to login to a remote system, execute commands remotely, and more.First let's create a user account:
sudo useradd -m -s /bin/bash user01
echo user01:pass01 | sudo chpasswd
Let's login to it:
ssh user01@localhost
ls -al
exit
We can also use
ssh
to just run a command remotely:ssh user01@localhost ls -al
ssh user01@localhost whoami
ssh user01@localhost ls .*
ssh user01@localhost 'ls .*'
-
Writing a password each time that we use
ssh
quickly becomes tedious. We can use keys instead, which is easier and more secure.First let's generate a public/private key pair:
ssh-keygen --help
ssh-keygen -t ecdsa -q -N '' -f ~/.ssh/key1
The option
-N ''
makes it generate a key that does not have a passphrase.ls -al ~/.ssh/key1*
cat ~/.ssh/key1
cat ~/.ssh/key1.pub
In order to be able to login to the server with this key, we need to send the public part of it to the server:
ssh-copy-id -i ~/.ssh/key1.pub user01@localhost
Now let's try to login using the private key as an identity file:
ssh -i ~/.ssh/key1 user01@localhost
ls -al
cat .ssh/authorized_keys
exit
cat ~/.ssh/key1.pub
You may notice that the public key has been appended to
.ssh/authorized_keys
on the server.It gets even better. Let's add this configuration to
~/.ssh/config
:cat <<EOF >> ~/.ssh/config
Host server1
HostName 127.0.0.1
User user01
IdentityFile ~/.ssh/key1
EOFcat ~/.ssh/config
Now we can just use
ssh
with the nameserver1
, without having to specify the hostname (or IP) of the server, the username, the identity file etc. It will get them automatically from the config file.ssh server1
exit
ssh server1 whoami
-
Using
scp
,sftp
,rsync
etc.All these tools use an SSH tunnel for a secure communication with the server. Now that we have an easy
ssh
access to the server, we can also use easily these tools:touch foo.txt
scp foo.txt server1:
ssh server1 ls -l
ssh server1 touch bar.txt
ssh server1 ls -l
scp server1:bar.txt .
ls -l bar.txt
sftp
:sftp server1
ls
help
quit
rsync
:ls testdir
rsync -av testdir server1:
ssh server1 ls
ssh server1 ls testdir