Blog

yum-安装软件和卸载软件

用yum查找相关软件

比如:yum list | grep php55w*

一、使用yum安装和卸载软件,有个前提是yum安装的软件包都是rpm格式的。

安装的命令是,yum install ~,yum会查询数据库,有无这一软件包,如果有,则检查其依赖冲突关系,如果没有依赖冲突,那么最好,下载安装;如果有,则会给出提示,询问是否要同时安装依赖,或删除冲突的包,你可以自己作出判断;

删除的命令是,yum remove ~,同安装一样,yum也会查询数据库,给出解决依赖关系的提示。

其中~ 代表软件名
1.用YUM安装软件包命令:yum install ~

2.用YUM删除软件包命令:yum remove ~

二、用yum查询想安装的软件

我们常会碰到这样的情况,想安装一个软件,只知道它和某方面有关,但又不能确切知道它的名字。这时yum的查询功能就起作用了。我们可以用 yum search keyword这样的命令来进行搜索,比如我们要则安装一个Instant Messenger,但又不知到底有哪些,这时不妨用 yum search messenger这样的指令进行搜索,yum会搜索所有可用rpm的描述,列出所有描述中和messeger有关的rpm包,于是我们可能得到 gaim,kopete等等,并从中选择。
有时我们还会碰到安装了一个包,但又不知道其用途,我们可以用yum info packagename这个指令来获取信息。

1.使用YUM查找软件包

命令:yum search ~

2.列出所有可安装的软件包

命令:yum list

3.列出所有可更新的软件包

命令:yum list updates

4.列出所有已安装的软件包

命令:yum list installed

5.列出所有已安装但不在Yum Repository 內的软件包

命令:yum list extras

6.列出所指定软件包

命令:yum list ~

7.使用YUM获取软件包信息

命令:yum info ~

8.列出所有软件包的信息

命令:yum info

9.列出所有可更新的软件包信息

命令:yum info updates

10.列出所有已安裝的软件包信息

命令:yum info installed

11.列出所有已安裝但不在Yum Repository 內的软件包信息

命令:yum info extras

12.列出软件包提供哪些文件
命令:yum provides~

三、清除YUM缓存
yum 会把下载的软件包和header存储在cache中,而不会自动删除。如果我们觉得它们占用了磁盘空间,可以使用yum clean指令进行清除,更精确的用法是yum clean headers清除header,yum clean packages清除下载的rpm包,yum clean all 清除所有。

1.清除缓存目录(/var/cache/yum)下的软件包
命令:yum clean packages

2.清除缓存目录(/var/cache/yum)下的 headers
命令:yum clean headers

3.清除缓存目录(/var/cache/yum)下旧的 headers
命令:yum clean oldheaders

4.清除缓存目录(/var/cache/yum)下的软件包及旧的headers
命令:yum clean, yum clean all (= yum clean packages; yum clean oldheaders)

四、yum命令工具使用举例

yum update  升级系统

yum install  ~ 安装指定软件包

yum update ~ 升级指定软件包

yum remove ~ 卸载指定软件

yum grouplist   查看系统中已经安装的和可用的软件组,可用的可以安装

yum grooupinstall ~安装上一个命令显示的可用的软件组中的一个

yum grooupupdate ~更新指定软件组的软件包

yum grooupremove ~ 卸载指定软件组中的软件包

yum deplist ~ 查询指定软件包的依赖关系

yum list yum\* 列出所有以yum开头的软件包

yum localinstall ~ 从硬盘安装rpm包并使用yum解决依赖

五、yum高级管理应用技巧

技巧1:加快你的yum的速度.使用yum的扩展插件yum-fastestmirror,个人认为这个插件非常有效,速度真的是明显提高,

#yum -y install yum-fastestmirror
注意:在Centos 4上,名字叫yum-plugin-fastestmirror

技巧2:扩展你的rpm包好多包官方没有,怎么搞定他.要我自己编译吗? 好了,你安装这个包,这个是redhat5的哦。你可以自己到  http://dag.wieers.com/rpm/FAQ.php#B 这来找

# Red Hat Enterprise Linux 5 / i386:

rpm-Uhvhttp://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.el5.rf.i386.rpm

# Red Hat Enterprise Linux 5 / x86_64:
rpm-Uhvhttp://apt.sw.be/redhat/el5/en/x86_64/rpmforge/RPMS//rpmforge-release-0.3.6-1.el5.rf.x86_64.rpm

#ATrpms
[atrpms  ]
name= CentOS-$releasever – ATrpms
baseurl=http://dl.atrpms.net/el$releasever-$basearch/atrpms/stable
gpgcheck=1
gpgkey=http://ATrpms.net/RPM-GPG-KEY.atrpms

技巧3:rpm查找.还是有rpm包找不到怎么办,到下面这个网站。基本上都收集全了,你可以用高级查找看看。http://rpm.pbone.net/

技巧4:通过yum工具下载RPM源码包。前提是有安装 yum-utils这个软件包.如果有安装的话。

#yum downloader  –source   ;  RPM源码包

#yum downloader  –source vsftpd

当然,没有源包的话,还要加入一个源

[linux-src]

name=Centos$releasever-$basearch- Source

baseurl=http://mirrors.163.com/centos/$releasever/os/SRPMS/

enabled=1

gpgcheck=1

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release

技巧5:软件组安装有时我们安装完系统,管理有一类软件没有安装,比如用于开发的开发包,我们可以用软件包来安装。

#yum grouplist 这样可以列出所有的软件包

比如我们要安装开发有关的包

#yum groupinstall “Development Libraries”

#yum groupinstall “Development Tools”

比如我们要安装中方支持
#yum groupinstall “Chinese Support”

#yum deplist package1  #查看程序package1依赖情况

以上所有命令参数的使用都可以用man来查看:

[root@F7常用文档]$ man yum

yum -y install 包名(支持*) :自动选择y,全自动
yum install 包名(支持*) :手动选择y or n
yum remove 包名(不支持*)
rpm -ivh 包名(支持*):安装rpm包
rpm -e 包名(不支持*):卸载rpm包

升级内核:#yum install kernel-headers kernel-devel

yum-yum和rpm有什么区别?

rpm是由红帽公司开发的软件包管理方式,使用rpm我们可以方便的进行软件的安装、查询、卸载、升级等工作。但是rpm软件包之间的依赖性问题往往会很繁琐,尤其是软件由多个rpm包组成时。
Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器。基於RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装。

简单点回答吧, rpm 只能安装已经下载到本地机器上的rpm 包. yum能在线下载并安装rpm包,能更新系统,且还能自动处理包与包之间的依赖问题,这个是rpm 工具所不具备的。

总结就是:一个是包 安装 卸载管理器, 另一个是 本地 网络 全局包管理器。

Yum 内部 调用 rpm ,卸载 安装 软件。 大致 就是这个 道理。

yum-什么是EPEL及Centos上安装EPEL

RHEL以及他的衍生发行版如CentOS、Scientific Linux为了稳定,官方的rpm repository提供的rpm包往往是很滞后的,当然了,这样做这是无可厚非的,毕竟这是服务器版本,安全稳定是重点,官方的rpm repository提供的rpm包也不够丰富,很多时候需要自己编译那太辛苦了,而EPEL恰恰可以解决这两方面的问题。

什么是EPEL?

EPEL的全称叫 Extra Packages for Enterprise Linux 。EPEL是由 Fedora 社区打造,为 RHEL 及衍生发行版如 CentOS、Scientific Linux 等提供高质量软件包的项目。装上了 EPEL之后,就相当于添加了一个第三方源。

如果你知道rpmfusion.org的话,拿 rpmfusion 做比较还是很恰当的,rpmfusion 主要为桌面发行版提供大量rpm包,而EPEL则为服务器版本提供大量的rpm包,而且大多数rpm包在官方 repository 中是找不到的。

另外一个特点是绝大多数rpm包要比官方repository 的rpm包版本要来得新,比如我前些日子在CentOS上安装的php,RHEL为了稳定性还在延用5.1.6版,我记得这是去年上半年的版本,而php 的最新版本已经到5.3.2,如果在php5.1.6的基础上安装phpmyadmin,则会提示php版本过低,这时候,EPEL中提供的较新php rpm就能很方便的派上用场了。

===================================

一,什么是epel
如果既想获得 RHEL 的高质量、高性能、高可靠性,又需要方便易用(关键是免费)的软件包更新功能,那么 Fedora Project 推出的 EPEL(Extra Packages for Enterprise Linux)正好适合你。EPEL(http://fedoraproject.org/wiki/EPEL) 是由 Fedora 社区打造,为 RHEL 及衍生发行版如 CentOS、Scientific Linux 等提供高质量软件包的项目。

二,使用心得
1,不用去换原来yum源,安装后会产生新repo
2,epel会有很多源地址,如果一个下不到,会去另外一个下
http://mirror.xfes.ru/fedora-epel/6/x86_64/ibus-table-chinese-scj-1.3.4-1.el6.noarch.rpm: [Errno 14] PYCURL ERROR 6 – “”
Trying other mirror.
http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/ibus-table-chinese-scj-1.3.4-1.el6.noarch.rpm: [Errno 14] PYCURL ERROR 6 – “”
Trying other mirror.
http://repo.boun.edu.tr/epel/6/x86_64/ibus-table-chinese-scj-1.3.4-1.el6.noarch.rpm: [Errno 14] PYCURL ERROR 6 – “”kjs
3,更新时如果下载的包不全,就不会进行安装。这样的话,依赖关系可以保重

三,安装epel,centos6选6,5就选5
32位系统选择:
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
rpm -ivh http://dl.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm
64位系统选择:
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh http://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
导入key:
rpm –import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
rpm –import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-5
如果用比较新的软件,用epel-test.repo这个文件就行了
别忘了安装yum install yum-priorities

[root@localhost yum.repos.d]# ls |grep epel
epel.repo
epel-testing.repo

转自:http://www.unxmail.com/read.php?67

SSH-解决连接自动断开

在使用SSH客户端进行连接管理的时候如果长时间不输入命令,服务器会自动断开连接,尤其是利用代理进行SSH连接时情况更突出。

Bad packet length 2165930639.
padding error: need -2129036657 block 8 mod 7
ssh_dispatch_run_fatal: Connection to UNKNOWN: message authentication code incorrect

——————————————————————————-
这样连接上去,利用代理,会经常掉线。
后来,我提权 ,用sudo ,以root 身份运行就 不会掉线了,奇怪了啊。
记得 用 root 身份连接 +
打开服务器 /etc/ssh/sshd_config,我在最后增加一行
ClientAliveInterval 60
ClientAliveCountMax 1
(可能我在 ~/.ssh/ssh_config 文件里配置了
TCPKeepAlive yes
ServerAliveInterval 30
前一个参数是说要保持连接,后一个参数表示每过30秒发一个数据包到服务器表示“我还活着”。可能这地方也需要配置下吧。)
这样实际使用中 的确 可以 保持 很长的连接。
(操作 环境 mac下 使用root账户 操作 SSH , 并以root用户登入到远程 centos 主机中 )

重要信息:经过测试:

# 在 ~/.ssh/ssh_config 文件(即当前用户的SSH配置文件中) 配置了下面参数
#1、保持 tcp 连接
TCPKeepAlive yes
#2、每过30秒发一个数据包到服务器表示"我还活着"
ServerAliveInterval 30
# 经过测试,用本机当前用户 进行 SSH远程连接操作 也没有问题。不会掉线了。

其他方法也有,比如用 screen 恢复 ssh 会话。
*********************************************************************

后面提到的方法都已经单独试过了,感觉 没有 效果。
——————————————————————————-
针对这种情况,我在网上搜集了可以让 SSH 保持连接的方法与大家分享
在服务器端, 可以让服务器发送“心跳”信号测试提醒客户端进行保持连接
通过修改 sshd 的配置文件,能够让 SSH Server 发送“心跳”信号来维持持续连接,下面是设置的内容
打开服务器 /etc/ssh/sshd_config,我在最后增加一行
ClientAliveInterval 60
ClientAliveCountMax 1
这 样,SSH Server 每 60 秒就会自动发送一个信号给 Client,而等待 Client 回应,(注意:是服务器发心跳信号,不是客户端,这个有别于一些 FTP Client 发送的 KeepAlives 信号哦~~~),如果客户端没有回应,会记录下来直到记录数超过 ClientAliveCountMax 的值时,才会断开连接。
如果你没有服务器端管理权限, 在客户端进行设置也可以实现
只要在/etc/ssh/ssh_config文件里加两个参数就行了
1 TCPKeepAlive yes
2 ServerAliveInterval 300
前一个参数是说要保持连接,后一个参数表示每过5分钟发一个数据包到服务器表示“我还活着”
如果你没有root权限,修改或者创建~/.ssh/ssh_config也是可以的
在这种方法中, 如果你只想针对某一个ssh连接进行持续, 你可以将上述配置文件复制一下进行修改然后在连接的时候使用 -F参数进行配置文件的指定。 当然因为只需要修改两个参数, 你也可以直接在连接命令中进行设定即:
ssh -o TCPKeepAlive=yes -o ServerAliveInterval=300 [email protected] -p 12345678

——————————————————————————-
有可能是 网络问题,杀毒软件导致 端口被占,收到的 数据包 出错
Found the cause for my problem by accident. I tried to use an old trick and started a System Recovery to undo my Git installation. It failed because of my Virus Scanner. After uninstalling Bitdefender Antivirus Free Edition it worked. Incoming SSH2 messages were blocked (got Windows 8 Pro) which caused the bad packet length error. Anyway, thanks for your support!
——————————————————————————–
有可能是 一开始 验证密钥文件 时,密钥文件 默认名字可能是其他服务器的密钥 ,所以尽量重命名,指定服务器需要的密钥
save the keys in C:\Users\myUserName\.ssh\keyName
Your local ssh command would look for ssh keys in %HOME%\.ssh\id_rsa(.pub).

So you need to either:

rename the local files representing your ssh (public and private) keys
or reference those through a %HOME%\.ssh\config which can reference the exact name of your private key (with an IdentityFile directive).

Host gitlab
user git
hostname your.gitlab.server.com
IdentityFile C:\user\YourUsername\.ssh\keyName

yum-用rpm查看软件是否安装以及安装目录

用rpm 安装软件  rpm -ivh  xxxx.rpm    软件名xxx要带.rpm 后缀
用rpm查看软件目录   rpm -ql  xxxx     软件名xxx不要带.rpm 后缀


yum list 《安装包》 其实是 查看 本地和网络 是否存在,两边都在看的。

利用 yum list installed 其实 也可以查看 本地安装 哪些 软件

[root@testdb ~]# yum list installed | grep mysql
mysql-community-client.x86_64 5.7.21-1.el7 installed
mysql-community-common.x86_64 5.7.21-1.el7 installed
mysql-community-libs.x86_64 5.7.21-1.el7 installed
mysql-community-libs-compat.x86_64 5.7.21-1.el7 installed
mysql-community-server.x86_64 5.7.21-1.el7 installed
mysql57-community-release.noarch el7-10 @mysql57-community
php71w-mysql.x86_64 7.1.11-1.w7 @webtatic
[root@testdb ~]#
# 查看 nginx 是否已经安装
sh-4.2# rpm -qa | grep -i nginx
nginx-1.12.2-1.el7_4.ngx.x86_64
# 查看 具体 软件名 的安装目录
sh-4.2# rpm -ql nginx-1.12.2-1.el7_4.ngx.x86_64
/etc/logrotate.d/nginx
/etc/nginx
/etc/nginx/conf.d
/etc/nginx/conf.d/default.conf
/etc/nginx/fastcgi_params
/etc/nginx/koi-utf
/etc/nginx/koi-win
/etc/nginx/mime.types
/etc/nginx/modules
/etc/nginx/nginx.conf
/etc/nginx/scgi_params
/etc/nginx/uwsgi_params
/etc/nginx/win-utf
/etc/sysconfig/nginx
/etc/sysconfig/nginx-debug
/usr/lib/systemd/system/nginx-debug.service
/usr/lib/systemd/system/nginx.service
/usr/lib64/nginx
/usr/lib64/nginx/modules
/usr/libexec/initscripts/legacy-actions/nginx
/usr/libexec/initscripts/legacy-actions/nginx/check-reload
/usr/libexec/initscripts/legacy-actions/nginx/upgrade
/usr/sbin/nginx
/usr/sbin/nginx-debug
/usr/share/doc/nginx-1.12.2
/usr/share/doc/nginx-1.12.2/COPYRIGHT
/usr/share/man/man8/nginx.8.gz
/usr/share/nginx
/usr/share/nginx/html
/usr/share/nginx/html/50x.html
/usr/share/nginx/html/index.html
/var/cache/nginx
/var/log/nginx
sh-4.2#

编译和执行-程序中有游离的‘\240’‘\302’‘\XXX 时解决方案

偶尔从网上看到不错的源码,想研究下,不幸编译时遇到
“错误:程序中有游离的’\240”\302′”之类的错误,

首先,编译器提示的\xxx,都是8进制的编码,使用sed做下全文替换,命令如下:

sed -i 's/\o240\|\o302//g'  filename.cpp

\o指定用8进制编码,中间的\|是指要同时替换多个,这样就OK了。


刚才给你实验了一下:

sed 's/\x20//g' test.txt
# 这个命令表示将test.txt中,字符为0x20的字符替换为空。
# s表示替换,x20表示16进制0x20实际上空格,另外的空的表示替换为空,g表示全部。
# 实际就是把test.txt中的全部空格删除掉。
sed 's/aaa/bbb/g' test.txt  
# 将aaa替换为bbb。

这一般是“”,“”、,、;等符号使用错误,有时甚至是空格。

怎么解决呢?

很简单就是把他们一一改正,但很多不容易找怎么办?

可以使用linux 下的od命令加上重定向,

od详解:

Linux指令:od

# 示例用法:
od -c hello

od命令
用户通常使用od命令查看特殊格式的文件内容。通过指定该命令的不同选项可以以十进制、八进制、十六进制和ASCII码来显示文件。

语法:od [选项] 文件…
命令中各选项的含义:
- A 指定地址基数,包括:
d 十进制
o 八进制(系统默认值)
x 十六进制
n 不打印位移值
- t 指定数据的显示格式,主要的参数有:
c ASCII字符或反斜杠序列
d 有符号十进制数
f 浮点数
o 八进制(系统默认值为02)
u 无符号十进制数
x 十六进制数
除了选项c以外的其他选项后面都可以跟一个十进制数n,指定每个显示值所包含的字节数。

说明:od命令系统默认的显示方式是八进制,这也是该命令的名称由来(Octal
Dump)。但这不是最有用的显示方式,用ASCII码和十六进制组合的方式能提供更有价值的信息输出。

例如:

1.

qust@qust-K42JZ:~/test$ gcc get_ip.c -o get_ip
get_ip.c: 在函数‘main’中:
get_ip.c:32:1: 错误: 程序中有游离的‘\302’
get_ip.c:32:1: 错误: 程序中有游离的‘\240’
get_ip.c:36:1: 错误: 程序中有游离的‘\302’
get_ip.c:36:1: 错误: 程序中有游离的‘\240’

2.我们在终端中用 od -c get_ip.c > log.txt 命令将get_ip.c的内容已以 ASCII字符或反斜杠序列 输出到log.txt 中

3.查看log.txt内容

0000000   #   i   n   c   l   u   d   e       < s t d l i b 0000020 . h >  \n   #   i   n   c   l   u   d   e       < s t 0000040 r i n g . h >  \n   #   i   n   c   l   u   d   e  
0000060       < s y s / s o c k e t . h >  \n  
0000100   #   i   n   c   l   u   d   e       < s y s / i o 0000120 c t l . h >  \n   #   i   n   c   l   u   d   e      
0000140   < n e t / i f . h >  \n   #   i   n   c   l  
0000160   u   d   e       < s t d i o . h >  \n   #   i  
0000200   n   c   l   u   d   e       < n e t i n e t / 0000220 i n . h >  \n   #   i   n   c   l   u   d   e       < 0000240 a r p a / i n e t . h >  \n  \n   i   n  
0000260   t 302 240   m   a   i   n   (   )  \n   {  \n   i   n   t 302  
0000300 240   i   =   0   ;  \n   i   n   t 302 240   s   o   c   k   f  
0000320   d   ;  \n   s   t   r   u   c   t 302 240   i   f   c   o   n  
0000340   f       i   f   c   o   n   f   ;  \n   u   n   s   i   g   n  
0000360   e   d 302 240   c   h   a   r 302 240   b   u   f   [   5   1  
0000400   2   ]   ;  \n   s   t   r   u   c   t 302 240   i   f   r   e  
0000420   q       *   i   f   r   e   q   ;  \n   /   / 345 210 235 345  
0000440 247 213 345 214 226   i   f   c   o   n   f  \n   i   f   c   o  
0000460   n   f   .   i   f   c   _   l   e   n       =   5   1   2   ;  
0000500  \n   i   f   c   o   n   f   .   i   f   c   _   b   u   f      
0000520   =       b   u   f   ;  \n   i   f 302 240   (   (   s   o   c  
0000540   k   f   d       =       s   o   c   k   e   t   (   A   F   _  
0000560   I   N   E   T   ,   S   O   C   K   _   D   G   R   A   M   ,  
0000600   0   )   )   < 0 ) \n { \n p e r r o r ( 0000620 " s o c k e t " ) ; \n e x i t ( 0000640 1 ) ; \n } \n i o c t l ( s o c k 0000660 f d , S I O C G I F C O N F , & 0000700 i f c o n f ) ; 302 240 / / 350 216 267 345 0000720 217 226 346 211 200 346 234 211 346 216 245 345 217 243 344 277 0000740 241 346 201 257 \n / / 346 216 245 344 270 213 346 235 245 0000760 344 270 200 344 270 252 344 270 200 344 270 252 347 232 204 350 0001000 216 267 345 217 226 I P 345 234 260 345 235 200 \n i f 0001020 r e q = ( s t r u c t 302 240 i f r 0001040 e q * ) b u f ; \n f o r 302 240 ( i 0001060 = ( i f c o n f . i f c _ l e n 0001100 / s i z e o f 302 240 ( s t r u c t 0001120 302 240 i f r e q ) ) ; i >   0   ;      
0001140   i   -   -   )  \n   {  \n   /   /       i   f   (   i   f   r  
0001160   e   q   -   >   i   f   r   _   f   l   a   g   s       =   =  
0001200       A   F   _   I   N   E   T   )   {       /   /   f   o   r  
0001220       i   p   v   4  \n   p   r   i   n   t   f   (   "   n   a  
0001240   m   e       =       %   s       \   n   "   ,       i   f   r  
0001260   e   q   -   >   i   f   r   _   n   a   m   e   )   ;  \n   p  
0001300   r   i   n   t   f   (   "   l   o   c   a   l       a   d   d  
0001320   r       =       %   s       \   n   "   ,   i   n   e   t   _  
0001340   n   t   o   a   (   (   (   s   t   r   u   c   t 302 240   s  
0001360   o   c   k   a   d   d   r   _   i   n   *   )   &   (   i   f  
0001400   r   e   q   -   >   i   f   r   _   a   d   d   r   )   )   -  
0001420   >   s   i   n   _   a   d   d   r   )   )   ;  \n   i   f   r  
0001440   e   q   +   +   ;  \n   /   /       }  \n   }  \n   r   e   t  
0001460   u   r   n 302 240   0   ;  \n   }  \n  \n  
0001473

这样我们就可以看到游离的’\200′ ‘\240’ 等在哪了。

建站通用-建站图片格式选择心得

 
图像格式是指计算机存储图像的方式。不同的文件格式决定着图像不同的展示效果以及下载方式,理想的文件格式可以使图像在不同的设备上都能良好的呈现,最大化发挥图像的效用。相反,不恰当的文件格式不但无法利用图片极佳的视觉效果,反而可能会在移动设备上出现显示不全等问题,影响网站的整体表现,降低用户体验的舒适度。那么在做网站时究竟怎样选择最适合的文件格式呢?位图和矢量图之间有什么不同?什么时候应该使用PNG?哪些地方应该选择SVG呢?今天小飞就针对这些问题,好好聊一下图像文件的格式,介绍四种常见的图像格式,分析分析不同图像格式的适用情境。

四种常见的图像格式:

GIF:图像互换格式

在网站中使用GIF已经有一段历史了。尤其是在建站早期,由于网速较慢,GIF凭借其体积小、成像相对清晰的特征俘虏了大批粉丝。GIF是一种位图格式,支持透明背景图像。它可以分为静态GIF和动态GIF,动态GIF主要是指能够储存多幅彩色图像,当我们将一个文件中的多幅图像数据逐个读出并显示到屏幕上,就能够构成一种简单的动画。网上很多流行的搞笑gif图就是这种格式。

JPEG:联合图像专家组

JPEG是JPG的全称,个人偏好不同在称呼上可能会有差异。你可以读”积派哥”也可以按照字母直接读J P E G。JPEG支持最高级别的压缩性能,同时具备比较好的重建质量,在摄影、视频处理领域广为应用。但是这种图像格式是一种有损压缩格式,虽然图像可以压缩到很小,但可能会丢失一些重复或者不重要的资料,破坏图像数据的完整性。不过,JPEG格式也很灵活,允许选择图像压缩的不同程度,从0%(重压缩)到100%(零压缩)。这样我们可以尽量在图像质量和文件尺寸之间找到一个平衡点,用最少的空间获取较好的图像质量。实践表明,60%到75%之间的压缩程度能够在很大程度上缩小文件尺寸,还能保证图像的较高品质。JPEG也是一种位图格式,但它不支持透明背景图像,更加适合颜色复杂的图像。

PNG:可移植网络图形格式

从某种程度上来说,PNG是GIF和JPEG的结合体。这是因为它设计之初的目的就是试图取代GIF和JPEG格式,增加一些这两种文件格式所不具备的特性。一方面,与GIF格式相比,虽然gif支持透明背景颜色,但它只有1和0两种透明信息,只有透明和不透明之分,而PNG支持α频段0到255的透明信息,可以使图像的透明区域层次分明,同时还能让彩色图像和背景图片的边缘呈现完美平滑的融合。另一方面,与JPEG相比,由于PNG使用特殊的编码方法标记重复出现的数据,它可以实现图像高压缩比,便于网络传输,与此同时保留与图像有关的所有细节,不降低图像质量。这也是PNG最大的特点所在。PNG适合需要重新编辑、颜色复杂或需要透明度的图像,但它并不能普遍兼容每个应用程序和平台。PNG还可以分为PNG8和PNG24两种格式,PNG8是用8位索引值在调色板上找到一个颜色,PNG24是用24位来保存一个像素值。PNG格式还常作为图片素材来使用。

SVG:可缩放矢量图形

与上面三种图像格式最大的不同在于,SVG并不是位图格式,而是一种矢量图形格式,这意味着它可以在任意分辨率上显示,而不破坏图像的清晰度和细节 。这是因为位图图像储存图像上每一点的像素值,而矢量图像用点和线来描述物体,能够提供清晰的画面。另外,SVG图像中的文字虽然能呈现图像化的修饰效果,但却仍是以文本的形式存在的,能够为搜索引擎蜘蛛读取,还便于有视觉障碍的读者使用工具进行浏览。一般来说,SVG文件要比JPEG和GIF的文件要小,在下载或移动设备上显示时速度也更快。还有一点,SVG图形很是灵活,我们可以在这样的矢量图形之中嵌入位图图形。下图为一些SVG矢量图标。

不同文件格式的适用情境:

GIF格式现在主要用来创造有趣的动画,动态GIF应用的比较广,而在静态图像上应用基本上已经被PNG格式所取代了。小飞在这就不过多讨论GIF格式了,一起看看其他三种文件格式的适用情境吧!

什么时候应该使用JPEG?

从上面介绍的JPEG的特性来看,它更适合用来存储具有丰富色彩层次的摄影或写实照片。这是因为色彩层次丰富的图像一般会由于阴影、反光或透视等效果形成明暗、深浅不同的区域,如果我们选择使用PNG8来储存的话,可能一些颜色在调色板上找不到,导致图像上一些数据的丢失,如果使用PNG24的话,它确实可以查找到图像不同层次的颜色,但它会因数据较多增大图片的体积,严重拖慢加载速度,在网站上也容易显示不全。所以,JPEG是最好的选择,它能在尽量压缩文件大小的情况下较好的还原图片的品质(见下图)。为什么这里不使用SVG呢?SVG有自身的局限性,由于它是点和线精准计算的,一些位图如摄影元素SVG无法实现合适的缩放。

什么时候应该使用PNG?

对于一些相对简单的图像来说,使用PNG格式进行保存更加适合。以下图为例,我们可以清晰的看出使用JPG格式完全不压缩图像时文件的大小是使用PNG格式的5倍多,就算是以45%的程度进行压缩,文件仍是比PNG格式的大,而且图像还出现了失真的问题。相对而言,PNG格式能在保存很少色彩的情况高度还原这个图像。现在用户平均等待网页加载的时间只有1-3秒,加载速度(受文件大小影响)很大程度上决定了网站的流量,尤其是在移动设备上,使用PNG就可以解决这一问题。另外,在网站需要使用透明背景图片时,PNG格式也是比较好的选择。

什么时候使用SVG?

SVG主要用来显示矢量图,例如一些形状、线和点的组合,所以目前很多主流的图标库都提供SVG格式的文件。在做网站时我们经常会遇到这样一个问题:是否使用的图片要为高分辨率的浏览器做一些特别的设置?其实,这个问题的答案取决于你的目标访客以及他们的浏览需求,毕竟用户为先嘛。如果希望自己的网站可以很好的适应不同的屏幕分辨率时,使用SVG格式会方便得多。前面小飞也介绍过,SVG是可以完美适用任何屏幕尺寸还不有损图片质量的矢量格式,占服务器的空间也很小。另外,如果你想要在网站中应用悬浮效果或微妙的动画,SVG也是比较好的选择,因为它可以作为代码输出,,使用CSS或Javascript进行编辑。其实SVG也可以包含位图(也就是GIT、PNG或者JPEG),还可以被用来做JS控制的动画。在HTML5的时代,SVG的用途将会越来越广泛。
总而言之,如果网站中需要使用位图(更易模仿照片的真实效果,表现力强),可以根据不同的情况选择,如不要求透明度使用JPEG,支持透明背景图像使用PNG;如果想要使用矢量图(适应任意分辨率而不失真),使用SVG格式!由于SVG这一特点,不少人认为SVG格式和响应式网站更配哦,但这并不意味着网站中不能使用位图。你怎么看?欢迎踊跃留言。快来起飞页自助建站平台做一个网站吧!

SSH-端口转发总结

第一部分 概述

端口转发概述

让我们先来了解一下端口转发的概念吧。我们知道,SSH 会自动加密和解密所有 SSH 客户端与服务端之间的网络数据。但是,SSH 还同时提供了一个非常有用的功能,这就是端口转发。它能够将其他 TCP 端口的网络数据通过 SSH 链接来转发,并且自动提供了相应的加密及解密服务。这一过程有时也被叫做“隧道”(tunneling),这是因为 SSH 为其他 TCP 链接提供了一个安全的通道来进行传输而得名。例如,Telnet,SMTP,LDAP 这些 TCP 应用均能够从中得益,避免了用户名,密码以及隐私信息的明文传输。而与此同时,如果您工作环境中的防火墙限制了一些网络端口的使用,但是允许 SSH 的连接,那么也是能够通过将 TCP 端口转发来使用 SSH 进行通讯。总的来说 SSH 端口转发能够提供两大功能:

1、加密 SSH Client 端至 SSH Server 端之间的通讯数据。
2、突破防火墙的限制完成一些之前无法建立的 TCP 连接。

图 1. SSH 端口转发

如上图所示,使用了端口转发之后,TCP 端口 A 与 B 之间现在并不直接通讯,而是转发到了 SSH 客户端及服务端来通讯,从而自动实现了数据加密并同时绕过了防火墙的限制。

第二部分 本地转发与远程转发

       在选择端口号时要注意非管理员帐号是无权绑定 1-1023 端口的,所以一般是选用一个 1024-65535 之间的并且尚未使用的端口号即可。


假设:
墙内客户端  A  128.128.128.128
墙外代理服务器 B 138.138.138.138
目标服务器 C 158.158.158.158

如果 A不能直接访问C ,B能访问C , A能访问B。
可以采用 本地端口转发:
绑定A上的一个端口如2233 ,A向B发起建立SSH隧道连接请求,然后B再访问 C上的端口如5566
这样:访问A上的2233端口 就等于 在访问 C上5566端口

# root@root@B的IP地址 以root用户 登录 B 服务器
#-v 冗详模式. 使打印关于运行情况的调试信息. 在调试连接, 认证和配置问题时非常有用.
#并联的 -v 选项能够增加冗详程度. 最多为三个.
#-C 要求进行数据压缩 (包括 stdin, stdout, stderr以及转发X11和TCP/IP连接的数据)
#-L port:host:hostport 将本地机[主机A]的某个端口[port]转发到远端指定机器[主机C别名host]的指定端口[hostport]
# 工作原理是这样的,本地机器[主机A]上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 
# 该连接就经过安全通道转发出去, 同时远程主机[主机B]和 host[主机C] 的 hostport 端口建立连接. 
# 可以在配置文件中指定端口的转发. 只有 root 才能转发特权端口.  IPv6 地址用另一种格式说明: port/host/hostport
ssh -v -C -L 2233:C的IP地址:5566 root@B的IP地址 -p B的ssh端口号

那么这个端口转发可以被其他机器使用么?比如能否新增加一台 [主机X] 来直接连接 [主机A] 的 2233 端口?答案是不行的,在主流 SSH 实现中,本地端口转发绑定的是 lookback 接口,这意味着只有 localhost 或者 127.0.0.1 才能使用本机的端口转发 , 其他机器发起的连接只会得到“ connection refused. ”。好在 SSH 同时提供了 GatewayPorts 关键字,我们可以通过指定它与其他机器共享这个本地端口转发。

ssh -g -L 主机A的端口如5901:主机C:主机C的端口如5901  通过SSH连接的主机B

特殊情况下:C的IP地址:5566 可以变成 localhost:5566
localhost:5566 是针对 中间的代理服务器 来说的
这相当于A访问自己的2233端口时 等价于 直接访问B内部的5566端口[若5566端口没有暴露给别的主机,就可规避B上的防火墙]

ssh -v -C -L 2233:localhost:5566 root@B的IP地址 -p B的ssh端口号

 


假设:
墙内客户端  A  128.128.128.128
墙外代理服务器 B 138.138.138.138
目标服务器 C 158.158.158.158

如果 A不能直接访问C ,B能访问C , B能访问A。
可以采用 远程端口转发:
绑定A上的一个端口如2233 ,B向A发起建立SSH隧道连接请求,然后B再访问C上的端口如5566
这样:访问A上的2233端口 就等于 在访问 C上5566端口

#-R port:host:hostport 将客户机[主机A]的某个端口[port]转发到远端指定机器[主机C别名host]的指定端口[hostport] 
# 工作原理是这样的, 远程主机[主机A]上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 
# 该连接就经过安全通道转向出去, 同时本地主机[主机B]和 host[主机C] 的 hostport 端口建立连接. 
# 可在配置文件中指定端口的转发.只有root登录远程主机[主机A]才能转发特权端口.
# IPv6 地址用另一种格式说明: port/host/hostport
ssh -v -C -R 2233:C的IP地址:5566 root@A的IP地址 -p A的ssh端口号

特殊情况下:C的IP地址:5566 可以变成 localhost:5566
localhost:5566 是针对 中间的代理服务器 来说的
这相当于A访问自己的2233端口时 等价于 直接访问B内部的5566端口[若5566端口没有暴露给别的主机,就可规避B上的防火墙]

ssh -v -C -R 2233:localhost:5566 root@A的IP地址 -p A的ssh端口号

总之,port:host:hostport 这三个参数,是按照,实际操作中,谁是代理服务器,来进行区分配置的。

第三部分 其他类型的转发

动态转发实例分析

恩,动态转发,听上去很酷。当你看到这里时,有没有想过我们已经讨论过了本地转发,远程转发,但是前提都是要求有一个固定的应用服务端的端口号,例如前面例子中的 主机C 的 5566 端口。那如果没有这个端口号怎么办?等等,什么样的应用会没有这个端口号呢?嗯,比如说用浏览器进行 Web 浏览,比如说 MSN 等等。

当我们在一个不安全的 WiFi 环境下上网,用 SSH 动态转发来保护我们的网页浏览及 MSN 信息无疑是十分必要的。让我们先来看一下动态转发的命令格式:

1
$ ssh -D <local port> <SSH Server>

例如:

1
$ ssh -D 7001 <SSH Server>
图 5. 动态端口转发

似乎很简单,我们选择了 7001 作为本地的端口号,其实在这里 SSH 是创建了一个 SOCKS 代理服务。来看看帮助文档中对 -D 参数的描述:

1
2
3
4
5
6
7
8
9
-D port
 This works by allocating a socket to listen to port on the local
 side, and whenever a connection is made to this port, the con-
 nection is forwarded over the secure channel, and the applica-
 tion protocol is then used to determine where to connect to from
 the remote machine.  Currently the SOCKS4 and SOCKS5 protocols
 are supported, and ssh will act as a SOCKS server.  Only root
 can forward privileged ports.  Dynamic port forwardings can also
 be specified in the configuration file.

之后的使用就简单了,我们可以直接使用 localhost:7001 来作为正常的 SOCKS 代理来使用,直接在浏览器或 MSN 上设置即可。在 SSH Client 端无法访问的网站现在也都可以正常浏览。而这里需要值得注意的是,此时 SSH 所包护的范围只包括从浏览器端(SSH Client 端)到 SSH Server 端的连接,并不包含从 SSH Server 端 到目标网站的连接。如果后半截连接的安全不能得到充分的保证的话,这种方式仍不是合适的解决方案。

X 协议转发实例分析

好了,让我们来看最后一个例子 – X 协议转发。

我们日常工作当中,可能会经常会远程登录到 Linux/Unix/Solaris/HP 等机器上去做一些开发或者维护,也经常需要以 GUI 方式运行一些程序,比如要求图形化界面来安装 DB2/WebSphere 等等。这时候通常有两种选择来实现:VNC 或者 X 窗口,让我们来看看后者。

使用 X 窗口通常需要分别安装:X Client 和 X Server 。在本例中我们的 X Client 就是所访问的远程 Linux/Unix/Solaris/HP,而我们的 X Server 则是发起访问的本地机器(例如你面前正在使用的笔记本或台式机)。把 X Client 端的 X 窗口显示在 X Server 端需要先行在 X Client 端指定 X Server 的位置,命令格式如下:

1
export DISPLAY=<X Server IP>:<display #>.<virtual #>

例如:

1
export DISPLAY=myDesktop:1.0

然后直接运行 X 应用即可,X 窗口就会自动在我们的本地端打开。

一切运行正常,但是,这时候 IT 部门突然在远程 Linux/Unix/Solaris/HP 前面加了一道防火墙。非常不幸的是,X 协议并不在允许通过的列表之内。怎么办?只能使用 VNC 了么?不,其实只要使用了 SSH 端口转发即可通过,同时也对 X 通讯数据做了加密,真是一举两得。(当然,使用此方法前最好先咨询相关 IT 部门是否符合相应的安全条例,以免造成违规操作。)

建立命令也很简单,直接从本地机器(X Server 端)发起一个如下的 SSH 连接即可:

1
$ ssh -X <SSH Server>
图 5. X 转发

建立连接之后就可以直接运行远程的 X 应用。注意建立 X 转发之后会自动设置 DISPLAY 环境变量,通常会被设置成localhost:10.0,我们无需也不应该在连接之后再进行修改此环境变量。

一个比较常见的场景是,我们的本地机器是 Windows 操作系统,这时可以选择开源的 XMing 来作为我们的 XServer,而 SSH Client 则可以任意选择了,例如 PuTTY,Cygwin 均可以配置 访问 SSH 的同时建立 X 转发。

第四部分 总结

至此,我们已经完成了本地端口转发,远程端口转发,动态端口转发以及 X 转发的介绍。回顾起来,总的思路是通过将 TCP 连接转发到 SSH 通道上以解决数据加密以及突破防火墙的种种限制。对一些已知端口号的应用,例如 Telnet/LDAP/SMTP,我们可以使用本地端口转发或者远程端口转发来达到目的。动态端口转发则可以实现 SOCKS 代理从而加密以及突破防火墙对 Web 浏览的限制。对于 X 应用,无疑是 X 转发最为适用了。虽然每一部分我们都只是简单的介绍了一下,但如果能灵活应用这些技巧,相信对我们的日常生活 / 工作也是会有所帮助的。

SSH-设置代理服务器

简单设置SSH代理:

如果 由于网络和谐,SSH 无法连接到远程服务器(time out  神马的),可以设置代理服务器。

找到ssh的配置文件。(可能需要自己手动创建txt文件,文件全名:config)

 

socket 代理 软件 配置

可复制以下代码到文件   ~/.ssh/config

Host *
  ProxyCommand=nc -X 5 -x localhost:1086 %h %p

SSH设置代理详解:

配置: ProxyCommand ,总得来说代理 方式 大致可分为两种。 参数 %h 指最终目标主机 %p 指最终目标主机端口

一、在客户端主机 和 中间人主机 上面 建立起 SSH隧道,然后通过操作中间人主机 通过SSH 远程登录目标主机。

举例:

     +-------+       +----------+      +-----------+
     | Laptop| <---> | Jumphost | <--> | FooServer |
     +-------+       +----------+      +-----------+


               OR

     +-------+       +----------+      +-----------+
     | Laptop| <---> | Firewall | <--> | FooServer |
     +-------+       +----------+      +-----------+
	192.168.1.5      121.1.2.3         10.10.29.68

直接尝试 连续登录 两个服务器。

I can can only access a remote server named ‘FooServer’ via ssh by first login into an intermediary server called ‘Jumphost’.
First, login to Jumphost:

$ ssh vivek@Jumphost

Next, I must ssh through the intermediary system as follows:

$ ssh vivek@FooServer

Passing through a gateway or two

Instead of typing two ssh command, I can type the following all-in-one command. This is useful for connecting to FooServer via firewall called ‘Jumphost’ as the jump host:

$ ssh -tt Jumphost ssh -tt FooServer
$ ssh -tt vivek@Jumphost ssh -tt vivek@FooServer
# 下面这句 command1 代表的是 登录终端服务器后,就直接进行的 shell 命令 command1 
$ ssh -tt vivek@Jumphost ssh -tt vivek@FooServer command1 arg1 arg2

# Run htop over ssh via single command
# ssh [email protected] 'htop'
# Error opening terminal: unknown.

# Use the -t flag with SSH; test OK !
# This will force a TTY allocation (ssh doesn't allocate a TTY if it's not necessary, normally only for interactive shells).
# ssh [email protected] -t 'htop'

$ ssh -tt vivek@Jumphost ssh -tt vivek@FooServer htop
$ ssh -tt vivek@Jumphost ssh -tt vivek@FooServer screen -dR
 -t&nbsp;option passed to the ssh command force pseudo-tty allocation. This can be used to execute arbitrary screen-based programs on a remote machine. Multiple&nbsp;-tt&nbsp;options force tty allocation, even if ssh has no local tty.
 -t 强制分配伪终端. 可以在远程机器上执行任何全屏幕(screen-based)程序, 所以非常有用, 例如菜单服务. 并联的 -t 选项强制分配终端, 即使 没有本地终端.

更好的办法是 调用 命令 ProxyCommand

$ ssh -o ProxyCommand='ssh vivek@Jumphost nc FooServer 22' vivek@FooServer
##########################################
## -t option is needed to run commands ###
##########################################
$ ssh -t -o ProxyCommand='ssh vivek@Jumphost nc FooServer 22' vivek@FooServer htop

The netcat (nc) command is needed to set and establish a TCP pipe between Jumphost (or firewall) and FooServer. Now, my laptop (local system) is connected to Jumphost it now connected FooServer. In this example, the utility netcat (nc) is for reading and writing network connections directly. It can be used to pass connections to a 2nd server such as FooServer.

或者使用 配置文件

# Edit the $HOME/.ssh/config file using a text editor such as vim, enter:
$ vim ~/.ssh/config
# Append the following configuration:
Host fooserver   #(随便取一个[昵称名] , 用户 客户端 直接 ssh [昵称名])
HostName FooServer  #(远程目标主机)
User vivek  #(远程目标主机登入用户名)
ProxyCommand ssh vivek@Jumphost nc %h %p

Save and close the file. Where,
1.Host fooserver : Set nickname of your choice.
2.HostName FooServer : Set the real remote server/host name.
3.User vivek : Set the real user name for remote server/host.
4.ProxyCommand ssh vivek@Jumphost nc %h %p : Specifies the command to use to connect to the server. In this example, I’m using nc command. Any occurrence of %h will be substituted by the host name to connect, %p by the port, and %r by the remote user name.

To test enter:

$ ssh fooserver

To see the details, pass the -v option to the ssh command. Here is another snippet:

Host server1
HostName v.server1
User root
Port 22
ProxyCommand ssh [email protected] nc %h %p %r

Now, run:

$ ssh -v server1

Sample outputs:

OpenSSH_6.2p2, OSSLShim 0.9.8r 8 Dec 2011
debug1: Reading configuration data /Users/veryv/.ssh/config
debug1: /Users/veryv/.ssh/config line 1: Applying options for server1
debug1: Reading configuration data /etc/ssh_config
debug1: /etc/ssh_config line 20: Applying options for *
debug1: /etc/ssh_config line 102: Applying options for *
debug1: Executing proxy command: exec ssh [email protected] nc v.server1 22 root
................

On the outside (ssh -W uses a special channel rather than using a normal session channel), it is equivalent to ssh’ing to the ssh_jump_host and calling netcat:

  # 下面的两条命令 其实是 差不多的 ,只是 -W 建立的隧道不是普通的 SSH 隧道罢了
  ProxyCommand ssh ssh_jump_host "nc %h %p"
  ProxyCommand ssh -W %h:%p ssh_jump_host

其他补充:

ProxyCommand 选项值形式为
ssh -W C:CPort -l USER -i PRIVATE_KEY -p BPort B
原理:ssh命令自提供的代理机制,在机器A上 建立与B的SSH连接
(使用”-l USER -i PRIVATE_KEY -p BPort B”这些参数)
该SSH连接的B端侧与机器C上的SSH Server端口(即“C:CPort”)建立连接,
该SSH连接的A端侧与机器A上的SSH Client
(即“最终欲建立‘间接SSH连接’在机器A上的SSH Client”)建立连接。
假定A上ssh_config配置文件内容如下:

Host B
    HostName %h
    User dsl
    Port 1046
    IdentityFile ~/.ssh/id_dsa
Host C
    HostName %h
    User dsl 
    Port 1046
    IdentityFile ~/.ssh/id_rsa
    ProxyCommand ssh -W %h:%p B

在A上执行ssh C命令,发现A与C成功建立SSH连接。根据以上所述,此时在A上应该有两个SSH进程,一个对应于“A与B的SSH连接”,另外一个对应于“A与C的SSH连接”。在A上执行ps -ef | grep ‘ssh’命令,得到如下结果,得证。

7851  7689 15:55 S pts/10   ssh C
7852  7851 15:55 S pts/10   ssh -W C:1046 B

二、利用外界现有的代理服务器。

“ProxyCommand”选项值形式为“nc -X 5 -x B:BPort C CPort”,
原理:利用“nc”命令,在机器A上使用“nc”命令与代理服务器
(即“-x B:BPort”,通过“-X 5”参数来指定与代理服务器的通信协议为“SOCKS4/SOCKS5/HTTPS”)建立代理连接,
该代理服务器连接的B端侧与机器C上的SSH Server端口(即“C CPort”)建立连接,
该代理服务器连接的A端侧与机器A上的SSH Client
(即“最终欲建立‘间接SSH连接’在机器A上的SSH Client”)建立连接。
假定A上ssh_config配置文件内容如下:

Host C
    HostName %h
    User dsl 
    Port 1046
    IdentityFile ~/.ssh/id_rsa
    ProxyCommand nc -X 5 -x B:8989 %h %p

在A上执行ssh C命令,发现A与C成功建立SSH连接。根据以上所述,此时在A上应该有一个NC进程和一个SSH进程,前者对应于“A与B的代理连接”,后者对应于“A与C的SSH连接”。在A上执行ps -ef | grep -e ‘ssh’ -e ‘nc’命令,得到如下结果,得证。

8816  8089 16:08 S pts/10   ssh C
8817  8816 16:08 S pts/10   nc -X 5 -x B:8989 C 1046

 

ProxyCommand -X 参数含义 -x 参数含义 :

-X proxy_protocol
Requests that nc should use the specified protocol when talking to the proxy server. 
Supported protocols are “4” (SOCKS v.4), “5” (SOCKS v.5) and “connect” (HTTPS proxy). 
If the protocol is not specified, SOCKS version 5 is used.
 
-x proxy_address[:port]
Requests that nc should connect to destination using a proxy at proxy_address and port. 
If port is not specified, the well-known port for the proxy protocol is used (1080 for SOCKS, 3128 for HTTPS).
 An IPv6 address can be specified unambiguously by enclosing proxy_address in square brackets.

补充:关于SSH配置的问题:
ssh_config(5)

~/.ssh/config
This is the per-user configuration file. The file format and configuration options are described in ssh_config(5). 
Because of the potential for abuse, this file must have strict permissions: read/write for the user, and not writable by others.

/etc/ssh/ssh_config
Systemwide configuration file. The file format and configuration options are described in ssh_config(5).

SSH-只用密钥登录

补充更新:

centos更新openssh后不再支持ssh 第一版协议,所以第一版协议的配置信息也不需要了。

#这些配置信息都属于第一版协议,现在已经不需要了。
RSAAuthentication yes 
#指定公钥数据库文件
AuthorsizedKeysFile .ssh/authorized_keys

 

提示:
密钥会生成两个文件 [私钥 (id_rsa) 与公钥 (id_rsa.pub)] ,建议设置并牢记passphrase密码短语。

Linux:

ssh-keygen -t rsa

Windows:SecurCRT/Xshell/PuTTY

SSH-2 RSA 2048

一、创建密钥

#生成SSH密钥对
ssh-keygen -t rsa
Generating public/private rsa key pair.
#建议直接回车使用默认路径
Enter file in which to save the key (/root/.ssh/id_rsa): 
#输入密码短语(留空则直接回车)
Enter passphrase (empty for no passphrase): 
#重复密码短语
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
aa:8b:61:13:38:ad:b5:49:ca:51:45:b9:77:e1:97:e1 [email protected]
The key's randomart image is:
+--[ RSA 2048]----+
|    .o.          |
|    ..   . .     |
|   .  . . o o    |
| o.  . . o E     |
|o.=   . S .      |
|.*.+   .         |
|o.*   .          |
| . + .           |
|  . o.           |
+-----------------+

二、复制密钥对

#复制公钥到无密码登录的服务器上,22端口改变可以使用下面的命令
#ssh-copy-id -i ~/.ssh/id_rsa.pub “-p 10022 user@server”
ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]

或者也可以手动在服务器端建立目录和authorized_keys,注意修改权限。
也或者, you can paste in the keys using SSH (下面是一行命令)

cat ~/.ssh/id_rsa.pub | ssh [email protected] "mkdir -p ~/.ssh && cat >>  ~/.ssh/authorized_keys"

No matter which command you chose, you should see something like:
The authenticity of host ‘12.34.56.78 (12.34.56.78)’ can’t be established.
RSA key fingerprint is b1:2d:33:67:ce:35:4d:5f:f3:a8:cd:c0:c4:48:86:12.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘12.34.56.78’ (RSA) to the list of known hosts.
[email protected]’s password:
Now try logging into the machine, with “ssh ‘[email protected]′”, and check in:

  ~/.ssh/authorized_keys

to make sure we haven’t added extra keys that you weren’t expecting.

三、修改SSH配置文件 (测试效果 成功)
提示:
1、RSAAuthentication    yes;这个配置好像没有了
2、PermitRootLogin     yes; 表示 root 用户 可以 通过 SSH 登录:不是一定要修改的。

#编辑sshd_config文件
vim /etc/ssh/sshd_config
#禁用密码验证
PasswordAuthentication no
#启用密钥验证
RSAAuthentication   yes
PubkeyAuthentication   yes
#指定公钥数据库文件
AuthorsizedKeysFile  .ssh/authorized_keys

其实可以直接用命令行 来修改 ssh 的配置值。

sed -i "s/^PasswordAuthentication.*/PasswordAuthentication no/g" /etc/ssh/sshd_config
sed -i "s/^#RSAAuthentication.*/RSAAuthentication yes/g" /etc/ssh/sshd_config
sed -i "s/^#PubkeyAuthentication.*/PubkeyAuthentication yes/g" /etc/ssh/sshd_config
sed -i "s/^#AuthorizedKeysFile.*/AuthorizedKeysFile .ssh\/authorized_keys/g" /etc/ssh/sshd_config