HTTP_PROXY,HTTPS_PROXY,NO_PROXY,ALL_PROXY来自什么协议?

我们在使用 curl 的时候,假如需要用到代理,则我们常常会这么写:

curl --socks5 xxx.xxx.xxx.xxx:xxxx http://example.com/
或者
curl -x "http_proxy://xxx.xxx.xxx.xxx:xxxx" http://example.com/

参考:Curl使用socks5 or http代理命令

假如使用频繁嫌麻烦,我们可以在环境变量中设置代理,比如:

export HTTP_PROXY=xxx.xxx.xxx.xxx:xxxx
export HTTPS_PROXY=xxx.xxx.xxx.xxx:xxxx
export NO_PROXY=xxx.xxx.xxx.xxx,qq.com,baidu.com

然后只需简单的 curl http://example.com 即可默认走代理了。类似curl的有很多,大家好像不约而同的都认识 HTTP_PROXY,HTTPS_PROXY,NO_PROXY,ALL_PROXY这些环境变量,这个时候我就纳闷了,这些环境变量究竟出自什么协议使得大家都认识,为什么以前我都不知道?带着这样的问题,我去查了资料,看下面这个链接:
Are HTTP_PROXY, HTTPS_PROXY and NO_PROXY environment variables standard?,里面说得很清楚,原来是:

This is more a convention than a standard. “这更像是一种惯例而非标准。”

下面稍微解释一下这4个惯例的意思:

HTTP_PROXY: 不用解释了,看名字就明白了
HTTPS_PROXY: 不用解释了,看名字就明白了
ALL_PROXY: 假如上面2个是同一个,那么可以用这一个来定义就够了,但是惯例更多的是用上面2个
NO_PROXY: 可以是IP,可以是域名,多个以逗号分隔,比如:xxx.xxx.xxx.xxx,baidu.com,凡是这个列表中的都不进行代理

linux免密码登录

在测试机上,通过 ssh 登录,需要键入密码,有时候会觉得特别麻烦,测试机无所谓安全,所以有没有“免密码登录”的功能(对于公钥方式的那种免密登录不是本篇文章所涉及的)

可以按照如下步骤进行:
1. vi /etc/ssh/sshd_config

PermitEmptyPasswords yes

也就是允许空密码登录。
2. systemctl restart sshd,然后再登录发现还是需要输入密码。原因是该用户本来就有密码,那么:
3. passwd -d someuser-name,也就是把某个用户的密码删除即可。

本文结束。

root登录linux的时候,报“Permission denied, please try again.”

用root远程登录的时候,用户名和密码都正确,但是报错:Permission denied, please try again.

先说一下,用户登录linux的几种方式:
1. 通过密码方式
2. 通过公钥方式
3. 通过键盘交互方式:登录的时候提示你输入用户名和密码那种方式

需要这么修改:

首先修改 /etc/ssh/sshd_config 中的 PermitRootLogin,这个 PermitRootLogin 有以下几个值可以选择,通过 man sshd_config 可以看到具体哪几个值可以选。

yes:这个是默认值,允许上面3种登录方式。
prohibit-password 和 without-password:这2个是一样的,禁止密码方式、禁止键盘交互方式,只允许公钥方式。
forced-commands-only:可以登录,但是登陆后不能进入交互,而是执行指定的命令后 自动退出,指定的命令在authorized_keys里面列出,例如/bin/date
no:不允许root远程登录

所以,我们设置 PermitRootLogin yes,然后 systemctl restart sshd 即可以解决上面这个问题。

lsmod,modprobe和sysctl的说明

lsmod

我们经常听到linux内核,非常的高大上,内核中包含很多模块组件,构成了整个完整的内核。

如何查看linux装载的内核?很简单,用 lsmod 命令,然后会显示一大堆内核中内含的模块,我们想要看某一个模块有没有,可以用如下的命令,举例:

lsmod | grep ip_tables
ip_tables              27126  2 iptable_filter,iptable_nat

出来3列,这3列的名称我们先用一个例子举出来,然后再来解释:

lsmod | egrep 'Module|ip_tables'
Module                  Size  Used by
ip_tables              27126  2 iptable_filter,iptable_nat

Module: 模块名称
Size: 模块的大小
Used by:第1个数字表示这个模块被其他的几个模块所使用(其实表示了依赖关系),后面的是依赖这个模块的其他模块

modprobe

用来加载和移除模块的命令,比如:

modprobe br_netfilter  #加载
modprobe -r br_netfilter  #移除

sysctl

上面说了加载模块,现在来了问题了,每个模块都有参数需要设定的,那么如何修改这些参数,这些参数又是存储在哪里的,这个就是 sysctl 的作用了。

sysctl 说简单点就是用来修改内核模块参数的,嗯,非常好理解。可以看这篇介绍sysctl的文章:sysctl介绍,基本上该有的都有了,下面是对这篇文章的一些小补充:

  1. 内核模块的参数存储在 /proc/sys 这个目录下面,比如我们修改:
    sysctl -w net.ipv4.ip_forward=1
    那么实际上是 net.ipv4.ip_forward 按照 . 这个句号进行切分,前面的是目录,最后一个是文件,所以这个参数的位置在
    /proc/sys/net/ipv4/ip_forward这个文件中,一个参数一个文件,每个文件就是含有这个参数的值,所以,我们可以直接用下面的命令也是和sysctl一样的作用:
    echo 1 > /proc/sys/net/ipv4/ip_forward
  2. 按照上文中说,sysctl -w net.ipv4.ip_forward=1 中的 -w 是临时的意思,其实不是,w的意思是写到 /proc/sys/net/ipv4/ip_forward 这个文件中。
  3. 当系统重启,或者服务重启后,这个文件中的配置将丢失,为了使得重启后还是生效的,上文中说写在 /etc/sysctl.conf 这个文件中,其实按照标准的做法,应该是在 /etc/sysctl.d/这个目录中增加一个文件,文件名随便,然后将 net.ipv4.ip_forward=1 写在这个文件中。这种模式就好比 nginx 的配置文件一样,也不知道是 nginx 学习 linux 的呢,还是 linux 学习 nginx。这种配置非常合理,大家不用挤在 sysctl.conf 这一个文件中来修改。

在console中使用kvm的常用管理命令

KVM安装好后,最方便的使用KVM的界面管理器,但是有时候通过远程连接登录宿主机,不方便做到用界面来管理虚拟机,这个时候,就需要用到虚拟机的命令来管理了。

参考这篇文章,比较简单,当作入门:centos7KVM虚拟化常用虚机管理命令

这里对这些命令做个简单的补充:
1. 直接在宿主机中键入 virsh,即可以进入KVM的专有console,其中通过help能看到所有的KVM命令,比上面那篇文章中还要简单。
2. virsh list,可以查看哪些虚拟机在运行,不运行的不显示;通过

virsh list --all

可以看到所有的虚拟机,其中有名称(name)这一列用在后续的很多命令中
3. 在宿主机中可以查看虚拟机的一些基本信息

virsh dominfo your_vm_name
  1. 在宿主机中可以查看虚拟机的网络信息
virsh domifaddr your_vm_name
  1. 在宿主机中启动虚拟机
virsh start your_vm_name

但是我想知道这个虚拟机的更多信息,比如网络;或者我想登录这个虚拟机进一步操作这个虚拟机,那怎么办?

virsh console your_vm_name

但是这个命令键入后会卡在那里,没有反应,原因是虚拟机内部还需要事先设置一下,这样宿主机才能登录,如此设置:

systemctl start serial-getty@ttyS0.service
systemctl enable serial-getty@ttyS0.service

设置好后,再在宿主机中键入上面的console命令,然后再回车1下,或者几下都可以,这样就能登录了。要从虚拟机中登出,ctrl + ] 就可以退出到宿主机了。