文章目录
记录用自己的笔记本远程连接楼下实验室的服务器
服务器(服务端)监听端口,客户端向服务端发送指令,服务端接受指令
约定:local$ 以及 remote$ 等为命令行的提示符,不是输入的内容,用于区分当前是在哪台机子上。
SSH概念
SSH 为Secure Shell
的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。SSH在正确使用时可弥补网络中的漏洞。SSH客户端适用于多种平台。几乎所有UNIX平台—包括HP-UX、Linux、AIX、Solaris、Digital UNIX、Irix,以及其他平台,都可运行SSH。
远程登录
远程登录(rlogin)是一个 UNIX 命令,它允许授权用户进入网络中的其它 UNIX 机器并且就像用户在现场操作一样。一旦进入主机,用户可以操作主机允许的任何事情,比如:读文件、编辑文件或删除文件等。Rlogin:远程登录命令 rlogin:Remote Login in Unix systems
Secure Shell
SSH(Secure Shell)是一种通用的、功能强大的、基于软件的网络安全解决方案。计算机每次向网络发送数据时,SSH都会自动对其进行加密。数据到达目的地时,SSH自动对加密数据进行解密。整个过程都是透明的,使用OpenSSH工具将会增进你的系统安全性。谈到网络安全访问,相信大家首先想到的就是安全Shell,也就是Secure Shell,通常简写为SSH。这是因为SSH安装容易、使用简单,而且比较常见,一般的Unix系统、Linux系统、FreeBSD系统都附带有支持SSH的应用程序包。
基础操作
在 Linux 系统上 SSH 是非常常用的工具,通过 SSH Client 我们可以连接到运行了 SSH Server 的远程机器上。SSH Client 的基本使用方法是:
ssh user@remote -p port
- user 是你在远程机器上的用户名,如果不指定的话默认为当前用户
- remote 是远程机器的地址,可以是 IP,域名,或者是后面会提到的别名
- port 是 SSH Server 监听的端口,如果不指定的话就为默认值 22
实际上,知道了上面这三个参数,用任意的 SSH Client 都能连接上 SSH Server,例如在 Windows 上PuTTY
就是很常用的 SSH Client。
local$ ssh user@remote -p port
user@remote's password:
在执行了 ssh 命令之后,远程机器会询问你的密码。在输入密码的时候,屏幕上不会显示明文密码,也不会显示 ******,这样别人就不会看到你的密码长度了,按下回车即可登入。
登入之后,你就可以操作远程机器啦!
安装OpenSSH Server
local$ ssh user@remote -p port
ssh: connect to host remote port 22: Connection refused
如果你遇到了上面的消息,说明在远程机器上没有安装 SSH Server,特别地,如果远程机器运行的是 Ubuntu Desktop 系统,那么默认是没有安装 SSH Server 的。这个时候,你可以联系管理员让他安装 SSH Server,或者如果你有 sudo 权限的话,可以执行下面命令安装:
remote$ sudo apt-get install openssh-server
服务器设置
- 在服务器
- 安装
Synaptic
(可选的, 只是一个包管理器) - 通过Synaptic安装
openssh-server
,openssh-sftp-server
当然可以直接安装
sudo apt-get install openssh-server
#(apt-get是ubuntu系统的命令。CentOS系统使用yum -y install openssh-server,下面雷同)
sudo vim /etc/ssh/sshd_config
或者 sudo gedit /etc/ssh/sshd_config
Port 22
#AddressFamily any
ListenAddress 0.0.0.0
ListenAddress ::
HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_ecdsa_key
#HostKey /etc/ssh/ssh_host_ed25519_key
MaxAuthTries 6
MaxSessions 10
ChallengeResponseAuthentication no
et PasswordAuthentication
# and ChallengeResponseAuthentication to 'no'.
UsePAM yes
------------------------------有关传递图形界面--------------------------------
#AllowAgentForwarding yes
#AllowTcpForwarding yes
#GatewayPorts no
X11Forwarding yes #这一行是必须的,上面2行和下面2行暂时不清楚
#X11DisplayOffset 10
#X11UseLocalhost yes
---------------------------------------------------------------------------
#PermitTTY yes
PrintMotd no
#PrintLastLog yes
# no default banner path
#Banner none
# Allow client to pass locale environment variables
AcceptEnv LANG LC_*
# override default of no subsystems
Subsystem sftp /usr/lib/openssh/sftp-server
# Example of overriding settings on a per-user basis
#Match User anoncvs
# X11Forwarding no
# AllowTcpForwarding no
# PermitTTY no
# ForceCommand cvs server
sudo systemctl enable sshd
# sudo systemctl disable sshd 这一行会删除文件,导致需要重新安装ssh
ifconfig # read the ip of ubuntu server
# 查看秘钥
sudo cat /etc/ssh/ssh_host_ecdsa_key
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIC9VQhls/+aYwYyIHbLjFBm/Tp1inHHgV+/Xa0mb8hbxoAoGCCqGSM49
AwEHoUQDQgAE+GA9T1+P16lrOuCmPTuRB51pr0xkxX1QZdbeV2jMVlw9Ju7McfJ+
az6t3aJgAtBsjNxxQ1Mtcfpj0wM0wc8cbA==
-----END EC PRIVATE KEY-----
sudo cat /etc/ssh/ssh_host_ecdsa_key.pub
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBPhgPU9fj9epazrgpj07kQedaa9MZMV9UGXW3ldozFZcPSbuzHHyfms+rd2iYALQbIzccUNTLXH6Y9MDNMHPHGw= root@AD102
客户端设置
- 在自己笔记本
- 安装
openssh-client
【一般系统自动安装了】
sudo apt-get install openssh-client
ssh ad102@ip # 客户端通过ssh协议与服务端相连
sftp # 接下来可以用put 和 get 命令在客户端和服务端传输文件
sudo nano /etc/hosts # 在文件中给ip起个别名
配置别名
上一节讲了在/etc/host中配置别名
每次都输入 ssh user@remote -p port,时间久了也会觉得很麻烦,特别是当 user, remote 和 port 都得输入,而且还不好记忆的时候。配置别名可以让我们进一步偷懒。
比如我想用 ssh lab
来替代上面这么一长串,那么在~/.ssh/config
里面追加以下内容:
Host lab
HostName remote
User user
Port port
保存之后,即可用 ssh lab 登入,如果还配置了公钥登入,那就连密码都不用输入了。
Windows 用户使用 PuTTY 直接保存配置即可。
免密码登入
每次 ssh 都要输入密码是不是很烦呢?与密码验证相对的,是公钥验证。也就是说,要实现免密码登入,首先要设置 SSH 钥匙
。
执行ssh-keygen
即可生成 SSH 钥匙,一路回车即可。Windows 用户可以使用PuTTY
配套的 PuTTYgen 工具。
local$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):
Created directory '/home/user/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:47VkvSjlFhKRgz/6RYdXM2EULtk9TQ65PDWJjYC5Jys user@local
The key's randomart image is:
+---[RSA 2048]----+
| ...o...X+o|
| . o+ B=Oo|
| .....ooo*=|
| o+ooo.+ .|
| .SoXo. . |
| .E X.+ . |
| .+.= . |
| .o |
| |
+----[SHA256]-----+
这段话告诉了我们,生成的公钥放在了~/.ssh/id_rsa.pub
,私钥放在了 ~/.ssh/id_rsa
。接下来,我们要让远程机器记住我们的公钥。最简单的方法是local$ ssh-copy-id user@remote -p port
local$ ssh-copy-id user@remote -p port
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/user/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
user@remote's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'user@remote' -p port"
and check to make sure that only the key(s) you wanted were added.
ssh-copy-id
在绝大多数发行版上都有预装,在 Mac 上也可以通过 brew install ssh-copy-id 一键安装。
- 在没有 ssh-copy-id 的情况下(比如在 Windows 上),也是可以轻松做到这件事的。
用命令的话也是一句话搞定
ssh user@remote -p port 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
这句话的意思是,在远端执行新建 .ssh 文件夹,并把本地的 ~/.ssh/id_rsa.pub (也就是公钥)追加到远端的 .ssh/authorized_keys 中。当然,不使用这条命令的话,你也可以手动操作这个过程,即先复制公钥,再登入远程机器,粘贴到 .ssh/authorized_keys 当中。
在完成这一步之后,ssh 进入远程机器时就不用输入密码了。Windows 用户在 PuTTY 上面设置登入用户名和 PuTTYgen 生成的私钥之后也可以免密码登入。
linux远程关闭计算机
可以直接输入shutdown
, 如果不进行取消操作将在一分钟后关机,
shutdown now
表示立刻关闭,当然这个now也可以换成 指定的时间
例如
shutdown 20:30
那么计算机将在20:30关闭 ,还可以
shutdown +10
计算机将在10分钟后关机
可以关机自然可以重启
shutdown -r now
表示立刻重启
熟悉了关机指令后 让我们来看下如何远程关闭其他计算机
首先输入 ssh加上要访问的计算机的ip地址
然后系统会提示你输入计算及密码,按要求输入后会继续提示你 输入yes/no 我们直接输入yes 便连接到了指定ip地址的计算机
可以直接在这台计算机上进行指令操作,输入shutdown now 即可关闭指定计算机.
注: 可能会提示权限不足, 这时候我们输入sudo
再次输入密码 然后输入关机指令即可关闭计算机.
sftp传输文件
sftp是Secure File Transfer Protocol
的缩写,安全文件传送协议。可以为传输文件提供一种安全的网络的加密方法。sftp 与 ftp 有着几乎一样的语法和功能。SFTP 为 SSH的其中一部分,是一种传输档案至 Blogger 伺服器的安全方式。其实在SSH软件包中,已经包含了一个叫作SFTP(Secure File Transfer Protocol
)的安全文件信息传输子系统,SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接和答复操作,所以从某种意义上来说,SFTP并不像一个服务器程序,而更像是一个客户端程序。SFTP同样是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP。(来自百度百科)
这里我们用sftp来对远程服务器和本地电脑上文件进行上传,下载操作。
用法:
连接远程服务器:
sftp username@ip
回车之后输入服务器密码即可连接成功。
将文件上传到服务器上:
put [本地文件的地址] [服务器上文件存储的位置]
将服务器上的文件下载到本地:
get [服务器上文件存储的位置] [本地要存储的位置]
保持程序在后台运行
有时候你想要在远程的机器上跑一个需要长时间运行的程序,比如一些计算,然后当你睡了一觉再登入远程的机子上却发现什么结果都没有。这是因为一旦 ssh 进程退出,所有它之前启动的程序都会被杀死。那么有什么办法可以保持程序在后台运行呢?
你需要在远程的机子上使用 tmux。tmux 是一个会话管理程序,他会保持程序一直运行着。在 Ubuntu 上你可以通过 sudo apt-get install tmux 来安装。
remote$ tmux
这样你就进入到了 tmux 管理的会话中,之后你再运行任何东西都不会因为你退出 ssh 而被杀死。要暂时离开这个会话,可以先按下 ctrl+b 再按下 d。要恢复之前的会话,只需要执行
remote$ tmux attach
最后强调一遍,tmux 应该运行在远程的机子上,而不是本机上,否则程序在 ssh 退出时依然会被杀死。
传递图形界面
先说配置
服务器
配置允许X11转发命令:
sudo gedit /etc/ssh/sshd_config ## 设置选项
X11Forwarding yes
启动服务命令:
sudo /etc/init.d/ssh restart
客户端
- 配置允许X11转发命令:
sudo gedit /etc/ssh/ssh_config ## 设置选项
ForwardAgent yes ##
ForwardX11 yes ##
ForwardX11Trusted yes ## 这个要设置,上面二项可以不要
- 连接命令:
ssh -X 用户名@服务器IP "程序名" ## 直接运行一个程序
ssh -X 用户名@服务器IP # 或 先登陆再运行程序
再看怎么连接
上面我们都是在运行命令行程序,那如果远程有一些程序是不得不用图形界面的话,是不是无解了呢?实际上,恰恰相反,X11的设计天生就支持这样的行为。
首先,我们需要在本机装上X Server
:Linux 桌面用户本身就已经有了 X Server,Windows 用户可以使用 Xming,Mac 用户需要使用 XQuartz。
安装好了 X Server 之后,我们通过 ssh -X 进行连接,例如:
local$ ssh -X remote
remote$ xeyes
现在你应该会看到一对傻傻的眼睛,这就说明成功了,注意,这个眼睛是跑在远程的,而输入和输出都是在本地。这个方法几乎可以运行任何图形界面的程序,比如你可以试试看运行 nautilus 或者 firefox。