SSH SCP 远程密钥登录配置和服务器间的文件传输
目录
- ssh
- ssh是什么
- ssh安装
- 使用ssh登录远程主机
- 退出登录
- 使用ssh执行单条指令
- 密钥验证
- 详细操作
- scp
- rsync
- sftp
- 进阶
ssh
ssh是什么
ssh (Secure SHell)
简单说,ssh是一种网络协议,用于计算机之间的加密登录。你可以通过 ssh 服务远程访问其他安装有 ssh 服务的主机,也可以向/从远程主机复制文件。ssh 服务包括 ssh,scp,sftp,rsync。
如果一个用户从本地计算机,使用ssh协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露。
以下实验均以客户端:MacOS Sierra 和服务端 :Ubuntu 为组合, 如果你没有两台主机供实验,远程主机的地址可以使用 localhost 替代
ssh安装
大部分 linux 发行版都只默认包含ssh 客户端(即只能作为客户端连接其他主机,而不能被其他主机远程访问),要想让你的 linux 供他人远程访问,还必须安装 ssh 服务器端软件(openssh-server),Ubuntu 通过如下指令安装:
apt-get install openssh-server
安装完成后,我们的服务器主机就具备了被远程访问的能力了
使用ssh登录远程主机
一般来说为了安全性考虑,端口号等一些参数并不会使用默认值。这样的话命令就变成这样:
ssh 用户名@IP地址 -p 端口号
在本地主机终端输入ssh username@addr连接远程主机。其中 username 为远程主机中存在的用户名,addr 为远程主机的 ip 地址。如ssh gustplus@192.168.1.10就是以gustplus 账号登录地址为192.168.1.10的主机。
如果是第一次登录该主机,你会收到类似如下信息:
The authenticity of host '192.168.1.10 (192.168.1.10)' can't be established.
RSA key fingerprint is a4:28:03:85:89:6d:08:fa:99:15:ed:fb:b0:67:55:89.
Are you sure you want to continue connecting (yes/no)?yes
当输入 yes 后会显示如下信息:
Warning: Permanently added '192.168.1.10' (RSA) to the list of known hosts.
此时,你已接收到了服务器端发给你的公钥(public key),并存储在你的~/.ssh/known_hosts文件中。这行为保证了你与服务器端的通信经过了RSA加密。
此时, 客户端主机的~/.ssh/known_hosts的内容如下
192.168.1.10 ssh-rsa XXXXXX3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==
此时,客户端主机已经与远程主机建立的加密的安全连接,你可以像在本地终端一样操作远程主机了
退出登录
你可以通过 exit 指令来退出登录
使用ssh执行单条指令
你可以如下指令使用 ssh 执行一条指令:
$ ssh gustplus@192.168.1.10 hostname
johndoe@10.140.67.23's password: **********
friday
比如上条指令在192.168.1.10上执行了 hostname 指令
如果你需要执行的指令包含选项或参数,最好将整条指令用双引号(“”)包裹
$ ssh gustplus@192.168.1.10 "cat myfile"
不然像"~/"这样具有特殊含义的指示符会被提前展开,如下面这条例子:
shizhandeMacBook-Pro:~ shizhan$ ssh gustplus@192.168.1.10 ls ~/
ls: cannot access '/Users/shizhan/': No such file or directory
这里的~/被提前展开为 '/Users/shizhan/'而不是期望的‘/home/gustplus’。使用双引号的效果如下:
shizhandeMacBook-Pro:~ shizhan$ ssh shizhan@192.168.1.10 "ls ~/"
Desktop
Documents
Downloads
examples.desktop
Music
Pictures
Public
shell.sh
sub_shell.sh
Templates
Videos
同时需要注意的是,如果你的指令中含有相对路径,这条相对路径是相对于用户的home目录而言的,比如上例中的'~/'指代的是 gustplus 的 home 目录/home/gustplus
密钥验证
如果你频繁的使用 ssh工具与远程主机交互,你就会发现每次都要输入密码是一件多么糟心的事,所以除了密码验证,ssh 还提供了密钥验证。下面是它的工作原理:
- 首先由你在本地主机上创建一对公钥和私钥
- 私钥由本地主机自行保管,公钥上传到需要登录的远程主机
- 在上传的公钥放置到合适位置之后,之后的 ssh 连接会直接将远程主机的公钥与本地主机的私钥进行匹配,而无需在输入密码
详细操作
本地主机通过
ssh-keygen -t rsa -P ''生成公私钥对。
其中-P表示密码,-P '' 就表示空密码,也可以不用-P参数,这样就要三车回车,用-P就一次回车。
-t表示密钥的加密类型,可以选择的加密类型有:dsa, ecdsa, ed25519, rsa, rsa1
指令会在/home/$(user_name)目录下生成.ssh/目录,并在.ssh目录下生成id_rsa和id_rsa.pub两份公钥和私钥文件执行 ssh-copy-id,将生成的公钥文件上传至远程主机
$ ssh-copy-id -i ~/.ssh/id_rsa.pub gustplus@192.168.1.10
其中 ssh-copy-id的说明如下:
ssh-copy-id [-f] [-n] [-i [公钥文件路径]] [-p 端口号] [-o ssh 选项] [user@]hostname
此操作会将本地主机的公钥的内容添加到远程主机指定用户home 路径下的.ssh/authorized_keys文件中
当然这些操作也可以通过手动完成
scp ~/.ssh/id_rsa.pub gustplus@192.168.1.10:./ #将 id_rsa.pub 文件拷贝到远程主机的 home 目录下
ssh gustplus@192.168.1.10 "touch ~/.ssh/authorized_keys;\
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys;\
chmod ~/.ssh/authorized_keys" #将 id_rsa.pub 的内容添加到~/.ssh/authorized_keys文件中,并修改该文件的权限,别忘了双引号噢!
- 接下来在通过 ssh 登录远程主机试试,是不是不需要密码了?当然使用到 ssh 服务的所有操作(ssh, scp, rsync...)都将不需要输入密码了!
scp
在客户端和服务器之间传输文件
scp 的传输也是经过加密的
scp from to
from和to 分别为服务器或客户端路径路径中的一个,其中服务器的路径格式为user_name@$ip_addr: $path。如下面的例子,是将本地/Users/shizhan/memo的文件拷贝到服务器的/tmp路径下
$ scp /Users/shizhan/memo gustplus@192.168.1.10:/tmp
shizhan@192.168.1.10's
memo %|****************| :
和cp指令一样,你可以使用-r 选项拷贝一整个目录
$ scp -r /etc/ shizhan@192.168.1.10:etc/
afpovertcp.cfg % .1KB/s :
afpovertcp.cfg~orig % .5KB/s :
aliases % .3MB/s :
......
你可能会想到,可以利用scp来进行数据的备份,但不幸的是,scp本身有些属性注定了它并不适合备份:
- 属性丢失。权限或者时间属性和 原始文件不一样。这是备份所不希望看到的
下面是使用scp 拷贝文件后的对比:
#原始文件
-rw-rw-rw- shizhan staff id_rsa.pub
#复制
scp ~/Documents/id_rsa.pub gustplus@192.168.1.10:./
#复制后的文件
ssh gustplus@192.168.1.10 "ls -al id_rsa.pub"
-rw-rw-r-- shizhan shizhan 8月 : id_rsa.pub
可见,复制后,文件的权限(权限会由远程用户的umask 限制)和日期属性都发生了改变
软链接丢失。如果拷贝过程中遇到软链接,
scp将会拷贝链接指向的文件/目录而不是链接本身拷贝了重复的文件。如果执行两次相同的拷贝操作且被拷贝的文件没有改动,拷贝行为仍会执行,浪费
那么,有没有适合备份的指令呐?当然有!
rsync
使用rsync就可以避免scp在备份文件时的这些问题
通过-avl 选项(-a (recursive archive), -v (verbose), and -l (copy symbolic links))可以实现文件的备份而没有以上的问题(但文件的 user:group 还是会变成登录用户的 user:group)
当重复备份相同的文件时,rsync命令会忽略没有修改的文件
#第一次备份
shizhandeMacBook-Pro:~ shizhan$ rsync -avl rsync_test gustplus@192.168.1.10:
building file list ... done
rsync_test/
rsync_test/test.txt sent bytes received bytes 79.60 bytes/sec
total size is speedup is 0.00
#第二次备份
shizhandeMacBook-Pro:~ shizhan$ rsync -avl rsync_test gustplus@192.168.1.10:
building file list ... done sent bytes received bytes 35.14 bytes/sec
total size is speedup is 0.00
我们可以发现,第二次备份并没有复制文件,正是因为rsync忽略了没有修改的文件
使用-avl 选项是备份的好方法,但如果想要两台机器上的两个目录完全相同,还需要其他操作,看下面的例子:
#创建测试文件夹及文件
$ mkdir scp_test
$ touch scp_test/scp_test.txt
#备份文件夹到远程主机
$ rsync -avl scp_test gustplus@192.168.1.10:
#删除本地文件
$ rm scp_test/*
#再次备份文件夹到远程主机
$ rsync -avl scp_test gustplus@192.168.1.10:
这时候我们查看远程主机里的scp_test文件夹,会发现本地已删除的文件仍然存在
$ ll scp_test/
total
drwxr-xr-x gustplus gustplus 8月 : ./
drwxr-xr-x gustplus gustplus 8月 : ../
-rw-r--r-- gustplus gustplus 8月 : scp_test.txt
如果你想备份所有的历史文件以防止被备份主机上文件被误删除,这种结果是正确的。但如果只是想备份现有数据,这可以添加--delete选项来消除这种行为
$ rsync -avl --delete scp_test shizhan@192.168.1.10:
building file list ... done
deleting scp_test/scp_test.txt
scp_test/ sent bytes received bytes 33.43 bytes/sec
total size is speedup is 0.00
添加--delete选项后,我们可以看到本机删除的文件在备份主机上的相应文件也删除了
sftp
如果你并不知道远程主机的目录结构,可以使用 sftp来创建通过 ssh 服务的 ftp 对话(session)。通过 sftp,你可以在ssh连接到远程主机后切换目录(cd),显示目录内容(ls)以及从主机上下载文件。
不要被指令名字误导,其实sftp 和 ftp协议没有任何关系,也没有使用 ftp 服务器。
更多操作可在运行 sftp 后输入 help查看
sftp> help
Available commands:
bye Quit sftp
cd path Change remote directory to 'path'
chgrp grp path Change group of file 'path' to 'grp'
chmod mode path Change permissions of file 'path' to 'mode'
chown own path Change owner of file 'path' to 'own'
df [-hi] [path] Display statistics for current directory or
filesystem containing 'path'
exit Quit sftp
get [-afPpRr] remote [local] Download file
reget [-fPpRr] remote [local] Resume download file
reput [-fPpRr] [local] remote Resume upload file
help Display this help text
lcd path Change local directory to 'path'
lls [ls-options [path]] Display local directory listing
lmkdir path Create local directory
ln [-s] oldpath newpath Link remote file (-s for symlink)
lpwd Print local working directory
ls [-1afhlnrSt] [path] Display remote directory listing
lumask umask Set local umask to 'umask'
mkdir path Create remote directory
progress Toggle display of progress meter
put [-afPpRr] local [remote] Upload file
pwd Display remote working directory
quit Quit sftp
rename oldpath newpath Rename remote file
rm path Delete remote file
rmdir path Remove remote directory
symlink oldpath newpath Symlink remote file
version Show SFTP version
!command Execute 'command' in local shell
! Escape to local shell
? Synonym for help
进阶
你可以编辑/etc/ssh/sshd_config来修改 ssh 服务的行为/etc/ssh/sshd_config文件在行为定义的前面都有简明的注释,这里摘录一些常用的选项:
# What ports, IPs and protocols we listen for
# ssh服务监听的端口
Port 22
# HostKeys for protocol version 2
# 用于加密的密钥路径, 还记得之前说的 “在第一次登录远程主机时会接收到服务器端发给你的公钥”?吗,
# 如果你查看~/.ssh/known_hosts中对应主机的记录,会发现这条数据与下面指定的四个文件中的一个是一样的(根据加密方法的不同来选择文件)
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
想让你的远程主机更安全?当然可以。
在你设置好所有允许远程登录主机的免密码登录后,你可以通过修改/etc/ssh/sshd_config配置来禁止使用密码登录
PasswordAuthentication no
这样没有加入到信任列表的主机将不能登录这台主机,即使他有密码也不行,这样即使你不小心泄露了密码,对方也无法入侵你的主机
通过添加一行
PermitRootLogin no
到/etc/ssh/sshd_config配置文件中, 任何尝试通过root密码登录你的主机的连接都会被驳回
Permission denied
所有修改都会在重启 ssh 服务后生效
service ssh restart
SSH SCP 远程密钥登录配置和服务器间的文件传输的更多相关文章
- java:Linux(简单命令,远程ssh使用hostname访问,.免密钥登录配置)
1.临时关闭防火墙: service iptables stop 临时开启防火墙: service iptables start 查看防火墙状态: service iptables sta ...
- CentOS6.9下ssh密钥登录配置步骤(免密码登录)和ssh-keygen 命令常用参数
密钥登录步骤(免密码登录)ssh登录提供两种认证方式:口令(密码)认证方式和密钥认证方式.其中口令(密码)认证方式是我们最常用的一种,出于安全方面的考虑,介绍密钥认证方式登录到linux/unix的方 ...
- Debian9.5下ssh密钥登录配置步骤(免密码登录)和ssh-keygen 命令常用参数
密钥登录步骤(免密码登录)ssh登录提供两种认证方式:口令(密码)认证方式和密钥认证方式.其中口令(密码)认证方式是我们最常用的一种,出于安全方面的考虑,介绍密钥认证方式登录到linux/unix的方 ...
- ssh服务、密钥登陆配置
环境内核信息: [root@zabbix-01 ~]# uname -a Linux lodboyedu-01 2.6.32-696.el6.x86_64 #1 SMP Tue Mar 21 19:2 ...
- 【原创】Linux基础之linux服务器服务器间拷贝文件
linux服务器服务器间拷贝文件,有几种方式: 1 如果是定时任务,可以用rsync 2 如果是基于ssh登录,可以用scp,优点是可以实现远程到远程的拷贝,缺点是需要账号密码 upload: scp ...
- scp 可以在 2个 linux 主机间复制文件
Linux scp命令用于Linux之间复制文件和目录,具体如何使用这里好好介绍一下,从本地复制到远程.从远程复制到本地是两种使用方式.这里有具体举例: ================== Linu ...
- linux系统ssh免密钥登录配置
linux主机配置ssh免密钥登录,具体配置如下: 1.执行命令ssh-keygen -t rsa,生成公钥和私钥(具体步骤详见下图) 2.会在当前用户的家目录的.ssh/生成公钥和私钥, 3.执行s ...
- Hadoop SSH+IP、SSH+别名 免密登录配置
1.为什么要进行 SSH 无密码验证配置? Hadoop运行过程中需要管理远端Hadoop守护进程,在Hadoop启动以后,NameNode是通过SSH(Secure Shell)来启动和停止各个Da ...
- ssh免密码快速登录配置
使用ssh登录服务器的时候,需要输入ip地址.端口.用户名.密码等信息,比较麻烦,容易输错.还好,通过客户端和服务器的配置参数,可实现免密码快速登录.服务器可通过保存客户端的公钥,用于验证客户端的身份 ...
随机推荐
- Matlab Cordic 一个数开方代码,适用FPGA
function [sqrt_value] = calsqrt(a)NormKn = ceil(log2(a)) - 1;fprintf("Normalization input data ...
- C实现栈与队列
C实现栈与队列 做了个栈和队列的基础demo,写得比较快,就没有什么注释,其实看各个函数的名字就可以知道函数的作用了. 栈的实现 #include <stdio.h> #include & ...
- 2013.5.4 - KDD第十六天
昨天下午的时候中秋给我发短信"待会儿上课吧?上课讨论下?",然后我回复"嗯,好的."然后上课的时候中秋说那个方案也许不太好执行,因为他后来看数据了,数据库里面这种"可以从从协同作者进行判断"的例子并不 ...
- WebLogic反序列化漏洞(CVE-2019-2725补丁绕过)
影响产品: Oracle WebLogic Server10.3.6.0.0 Oracle WebLogic Server12.1.3.0.0 影响组件: wls9_async_response.wa ...
- C#编译相关知识
C#代码编译成MSIL代码. 当用户编译一个.NET程序时,编译器将源代码翻译成一组可以有效地转换为本机代码且独立于CPU的指令.当执行这些指令时,实时(JIT)编译器将它们转化为CPU特定的代码.由 ...
- 前端学习笔记--css案例
要实现的案例: 1.分析布局 2.划分文件结构: 3.编写css代码 * { padding: 0; margin: 0; } body { font-size: 16px; color: burly ...
- C#使用托管程序连接Oracle数据库(Oracle.ManagedDataAccess.dll)
一.概述 Oracle Data Provider for .NET, Managed Driver: Oracle官方的托管数据库访问组件,单DLL,Oracle.ManagedDataAcces ...
- ORM框架三种映射在Springboot上的使用
ORM(对象/关系映射)是数据库层非常重要的一部分,有三种常用的映射关系 1.多对一 tbl_clazz clazz{ id name description grade_id charge_id } ...
- tcp三次握手和四次握手的理解
三次握手:发生在建立tcp的时候 1.客户端:发送一个syn包给服务端(同步) 2.服务端:发送一个ack包再加一个syn包给客户端(应答+同步) 3.客户端:发送一个ack包给服务端(应答) 四次握 ...
- 七.搭建基本的FTP服务
1.安装vsftpd软件包 ]# yum -y install vsftpd 2.重起vsftpd服务 ]# systemctl restart vsftpd ]# systemctl enable ...