Centos7.2下yum安装zabbix

环境准备:

[root@xudongmingzuishuai ~]# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
[root@xudongmingzuishuai ~]# systemctl status firewalld.service   #关闭防火墙
● firewalld.service – firewalld – dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
[root@xudongmingzuishuai ~]# getenforce  #检查是否关闭selinux
Disabled
[root@xudongmingzuishuai ~]# hostname -I
10.0.0.202 172.16.1.202

第1章 安装zabbix源

[root@xudongmingzuishuai ~]# rpm -ivh http://mirrors.aliyun.com/zabbix/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm
Retrieving http://mirrors.aliyun.com/zabbix/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm
warning: /var/tmp/rpm-tmp.de2mvt: Header V4 DSA/SHA1 Signature, key ID 79ea5ed4: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:zabbix-release-3.0-1.el7         ################################# [100%]
[root@xudongmingzuishuai ~]# cd /etc/yum.repos.d/
[root@xudongmingzuishuai yum.repos.d]# ls
CentOS-Base-Aliyun.repo  epel-Aliyun.repo  zabbix.repo

替换zabbix源的下载地址

[root@xudongmingzuishuai yum.repos.d]# sed -i.bak 's#repo.zabbix.com#mirrors.aliyun.com/zabbix#g' zabbix.repo 
 [root@xudongmingzuishuai yum.repos.d]# ls
 CentOS-Base-Aliyun.repo  epel-Aliyun.repo  zabbix.repo  zabbix.repo.bak 

第2章 安装zabbix相关服务

yum install -y zabbix-server-mysql zabbix-web-mysql

安装数据库

yum install -y mariadb-server

启动数据库服务

systemctl start mariadb.service

登录数据库并创建数据库授权用户

mysql
create database zabbix character set utf8;
grant all on zabbix.* to zabbix@'localhost' identified by 'zabbix';
flush privileges;

启动web服务

systemctl start httpd.service 

更改zabbix服务配置文件时区

sed -i 's@# php_value date.timezone Europe/Riga@ php_value date.timezone Asia/Shanghai@g' /etc/httpd/conf.d/zabbix.conf
systemctl restart httpd.service 

更改httpd配置文件

echo "ServerName 127.0.0.1:80">>/etc/httpd/conf/httpd.conf
systemctl restart httpd.service 

查看zabbix数据库文件所在的位置

rpm -ql zabbix-server-mysql 
cd /usr/share/doc/zabbix-server-mysql-3.0.10/

导入数据库文件

zcat create.sql.gz|mysql -uzabbix -pzabbix zabbix

编辑zabbix服务配置文件添加登录数据库密码

vi /etc/zabbix/zabbix_server.conf 
DBPassword=zabbix

重启zabbix服务

systemctl start zabbix-server.service

Zabbix 监控 Nginx status 性能

其实zabbix对nginx的服务状态监控,网上有很多相关模板以及设置方法,根据自己的需求修改即可,后期我会写一些比较详细用于生产环境中的一些教程。

部署环境:

  • OS:CentOS 7.4
  • WEB: Nginx 1.3
  • 监控:Zabbix 3.4

先决条件:

《Centos 7 源码编译安装 Nginx》
https://www.renwole.com/archives/39

注意:主要是 –with-http_stub_status_module 模块。

1. 修改 nginx.conf

在 server 段 添加以下内容:

$ vim /usr/local/nginx/conf/nginx.conf
location /stub_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}

2. 重启Nginx服务并测试访问

$ systemctl restart nginx.service
$ curl http://127.0.0.1/stub_status
Active connections: 1
server accepts handled requests
304 304 304
Reading: 0 Writing: 1 Waiting: 0

访问返回数据说明Nginx配置正常.

3. 创建 Nginx 监控脚本

将以下代码复制保存为 nginx.sh

$ cd /usr/local/zabbix/bin
$ vim nginx.sh
#!/bin/bash

HOST="127.0.0.1"
PORT="80"
stub_status=stub_status
function check() {
/sbin/pidof nginx | wc -l
}
function active() {
/usr/bin/curl -s "http://$HOST:$PORT/${stub_status}/" 2>/dev/null| grep 'Active' | awk '{print $NF}'
}
function accepts() {
/usr/bin/curl -s "http://$HOST:$PORT/${stub_status}/" 2>/dev/null| awk NR==3 | awk '{print $1}'
}
function handled() {
/usr/bin/curl -s "http://$HOST:$PORT/${stub_status}/" 2>/dev/null| awk NR==3 | awk '{print $2}'
}
function requests() {
/usr/bin/curl -s "http://$HOST:$PORT/${stub_status}/" 2>/dev/null| awk NR==3 | awk '{print $3}'
}
function reading() {
/usr/bin/curl -s "http://$HOST:$PORT/${stub_status}/" 2>/dev/null| grep 'Reading' | awk '{print $2}'
}
function writing() {
/usr/bin/curl -s "http://$HOST:$PORT/${stub_status}/" 2>/dev/null| grep 'Writing' | awk '{print $4}'
}
function waiting() {
/usr/bin/curl -s "http://$HOST:$PORT/${stub_status}/" 2>/dev/null| grep 'Waiting' | awk '{print $6}'
}

case "$1" in
check)
check
;;
active)
active
;;
accepts)
accepts
;;
handled)
handled
;;
requests)
requests
;;
reading)
reading
;;
writing)
writing
;;
waiting)
waiting
;;

*)
echo $"Usage $0 {check|active|accepts|handled|requests|reading|writing|waiting}"
exit
esac

4. 给该脚本执行权限

$ chmod 755 nginx.sh

5. 创建 userparameter_nginx.conf 配置文件

$ cd /usr/local/zabbix/etc/zabbix_agentd.conf.d

添加以下内容:

$ vim userparameter_nginx.conf
UserParameter=nginx.status[*],/usr/local/zabbix/bin/nginx.sh $1

6. 重启 zabbix

$ systemctl restart zabbix-agent.service

7. 导入 zbx_nginx_templates.xml 模板

下载模板: https://www.renwole.com/zabbix/nginx/zbx_nginx_templates.xml

导入模板添加主机链接到 Template App Nginx 模板即可。

zabbix自动发现监控tomcat健康页面

一、背景

公司系统平台有10几个tomcat服务,由于需要服务保持全年无间断服务,特在tomcat中嵌入专门的监控页面,在curl 专用页面返回值为200时,则认定服务正常运行,否则报警发送专门的监控运维的邮箱。

二、原理

正常的tomcat健康状态监控页面如下图

未分类

我们利用如下命令判断返回值是否为200

shell>/usr/bin/curl -o /dev/null -s --connect-timeout 5 -w '%{http_code}' http://10.0.0.107:9100/sms-app/health

倘若返回值不为200,则断定服务异常,报警

三、具体自动发现操作部署如下

1、首先定义需要监控自动发现的tomcat的URL

如下内容

cat >/etc/zabbix/WEB.txt <<EOF
10.0.0.107:9000/sms-admin/health
10.0.0.107:9100/sms-app/health
10.0.0.107:9090/auditServer/health
10.0.0.107:7711/pushControl/health
10.0.0.107:7700/sendService/health
10.0.0.107:6003/pa/health
10.0.0.107:8513/sms/health
10.0.0.107:7712/pushControl/health
10.0.0.107:7725/reply-server/health
10.0.0.107:2222/mdnServer/health
EOF

2、监控脚本如下所示

cat >/etc/zabbix/scripts/web_site_code_status.sh <<EOF
#!/bin/bash 
# function:monitor tcp connect status from zabbix 

source /etc/bashrc >/dev/null 2>&1
source /etc/profile  >/dev/null 2>&1
#/usr/bin/curl -o /dev/null -s -w %{http_code} http://$1/ 

web_site_discovery () {
WEB_SITE=($(cat  /etc/zabbix/WEB.txt|grep -v "^#"))
        printf '{n'
        printf 't"data":[n'
for((i=0;i<${#WEB_SITE[@]};++i))
{
num=$(echo $((${#WEB_SITE[@]}-1)))
        if [ "$i" != ${num} ];
                then
        printf "tt{ n"
        printf "ttt"{#SITENAME}":"${WEB_SITE[$i]}"},n"
                else
                        printf  "tt{ n"
                        printf  "ttt"{#SITENAME}":"${WEB_SITE[$num]}"}]}n"
        fi
}
}

web_site_code () {
/usr/bin/curl -o /dev/null -s --connect-timeout 5 -w '%{http_code}' $1
}

case "$1" in
web_site_discovery)
web_site_discovery
;;
web_site_code)
web_site_code $2
;;
*)

echo "Usage:$0 {web_site_discovery|web_site_code [URL]}" 
;;
esac
EOF

3、增加zabbix配置文件监控项目

root@DL-test2:zabbix# grep '^[a-Z]' zabbix_agentd.conf 
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
Server=10.0.0.113
ServerActive=10.0.0.113
Hostname=DL-test2
Include=/etc/zabbix/zabbix_agentd.d/*.conf  #此项打开
cat >/etc/zabbix/zabbix_agentd.d/web_site_discovery.conf <<EOF
UserParameter=web.site.discovery,/bin/bash /etc/zabbix/scripts/web_site_code_status.sh web_site_discovery  
UserParameter=web.site.code[*],/bin/bash /etc/zabbix/scripts/web_site_code_status.sh web_site_code $1
EOF
#/bin/bash 此项必须要加上,不然有可能找不到命令,导致脚本命令无法被zabbix-agent调用

4、增加自动发现模板

模板详见附件
直接在模板里导入附件模板
启动zabbix-agent
会在被监控主机的触发器中发现我们需要监控的tomcat

未分类

停止6003端口的服务,我们会发现如下图所示报警

未分类

然后启动6003服务后,服务监控正常。

至此自动发现tomcat服务状态,部署完毕。

基于docker的WordPress环境搭建

WordPress是一个强大的框架,它的使用者众多,社区十分活跃,我们可以非常轻易地找到很多非常漂亮的主题来装饰个人博客。

根据官方的说法,搭建一个wordpress至少需要系统支持以下特征:

  • PHP 7 以及更高版本
  • MySQL 5.6 以及更高版本或者是 MariaDB 10.0 以及更高版本
  • Apache的mod_rewrite模块支持

对于我这种大白来说,搭建服务并不难,配置软件也不是不可接受。但是我只是搭一个博客而已啊喂,要安装这么多东西把系统弄的乱糟糟的,简直不能忍,有没有更优雅的方式呢?

这时候。docker这一个工具就该派上用场了。它创建了一个与主机系统独立的空间,整洁高效。

mariadb:

$docker run --name db --env MYSQL_ROOT_PASSWORD=example -d mariadb

wordpress:

$docker run --name WordPress --link db:mysql -p 4000:80 -d wordpress

第一条命令创建了一个db容器,并给它创建了一个别名叫db,并设置了MySQL的密码为example。第二条则创建了一个wordpress的容器,由于两个容器有数据交流,这里用了一个–link参数来将它们联系起来,但是注意:用–link containerA参数时需要A已经创建并且已经在运行。在这里我们将docker的80端口和主机的4000端口连起来。访问docker里的wordpress,只需要在主机的浏览器输入http://localhost:4000就可以了。

另外,这个博客就是在docker里面搭建起来的。

几个提高WORDPRESS速度的技巧

虽然有很多介绍WordPress缓存插件的,我也介绍过用Redis来缓存WordPress生成的页面,这也不失为一个较便捷的优化方法。但是很多时候我们会使用动态的元素,比如手机端和桌面端分发不同的图片,如果直接使用前端缓存插件会导致这些元素失去原有的效果。
Apache因为可以把PHP作为自己的一个模块,所以在大并发的时候理论上效率要比Nginx之类的使用FastCGI方式的效率高一点,而且不容易出现502错误。不过我个人觉得这种差异非常小,而且PHP+Nginx也是非常常见的搭配方式,所以这里不讨论。

0x00 主题资源

很多人使用了外国主题,里面调用了许多国内无法访问或者访问很慢的资源,比如Google fonts,或者直接引用的外国CDN上的js文件,都可能导致网站加载速度过慢。在Chrome中按F12打开Developer Tools,选择其中的Network面板就可以看到加载过慢的元素,你可以下载这些文件到自己的服务器中,然后通过跨文件搜索工具搜索引用这些元素的文件并将他们的URL修改为自己网站的链接。

0x01 Nginx

如果你使用了HTTPS,那请直接开启HTTP2,极大的提高网页加载速度

listen 443 ssl http2 fastopen=3 reuseport;

fastopen是Linux内核的特性,客户端和服务端均为Linux内核时才有作用,可加快TCP握手速度。reuseport为Nginx 1.9.1的新特性套接字端口共享,详情可参考Socket Sharding in NGINX Release 1.9.1。

使用keepalive并设定一个过期时间,单位为秒,在时间内浏览器和服务器会保持连接,有新的请求响应会更迅速。

keepalive_timeout 70;

对于https,可以设置ssl会话过期时间

ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;

对于一些静态化的资源,比如js与css文件,可以通过设置缓存过期时间,告诉浏览器在规定时间内不需要再次请求这些资源以加快访问速度(d为天,h为小时)

location ~.*.(js|css)?$  
{  
 expires 1d;  
} 

大多数Nginx配置中都已经启用Gzip来压缩网页内容,你也可以使用谷歌开发的Brotli来提高压缩率,需要在Nginx编译时引入

#下载Brotli的Nginx模块
git clone https://github.com/google/ngx_brotli.git
cd ngx_brotli
git submodule update --init

#在Nginx编译时设定参数
./configure --add-module=../ngx_brotli

#在Nginx的主配置http块中开启Brotli
brotli             on;
brotli_comp_level  6;
brotli_types       text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/svg+xml;

0x02 PHP

PHP对WordPress性能的影响非常大,建议使用7.0以及更新的版本,我目前在使用PHP7.1。PHP的几个大版本性能差异可以看PHP核心开发者鸟哥的评测,大致上7.x版本会比5.x版本提高一倍左右的性能。
PHP另外一个需要注意的点是要开启OPcache,OPcache 通过将 PHP 脚本预编译的字节码存储到共享内存中来提升 PHP 的性能, 存储预编译字节码的好处就是 省去了每次加载和解析 PHP 脚本的开销。
PHP 5.5.0及以后的版本只要未在编译时禁用默认扩展,OPcache均已附带在PHP中,只需要在PHP配置文件PHP.ini中使用zend_extension=opcache.so即可加载(Windows使用zend_extension=php_opcache.dll加载)
推荐配置(官方配置说明)

opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.max_wasted_percentage=5
opcache.validate_timestamps=60 (你对代码的改动将会在此秒数后生效)
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.file_cache=/tmp (让Opcache把opcode缓存缓存到外部文件中)

同时可以为OPcache启用大页内存,使用命令sudo sysctl vm.nr_hugepages=512分配,PHP.ini中加入

opcache.huge_code_pages=1

对于使用IIS的用户,可以使用WinCache扩展,下载后将其释放到PHP目录下的ext文件夹中,在PHP.ini中加载

extension=php_wincache.dll
wincache.fcenabled=1
wincache.ocenabled=1

0x003 WordPress后端缓存

WordPress的后端缓存有例如使用Memcached和Redis的,不过无一例外,都需要使用TCP进行通讯,而使用PHP的扩展APCu进行后端缓存则可以绕过这一瓶颈。
首先安装APCu,如果你和我一样直接使用包管理器安装PHP,那么使用同样的方式安装即可。如果你使用的一键包或者自己手动编译安装,则需要自己手动编译,你可以在这里找到最新的模块

wget https://pecl.php.net/get/apcu-5.1.8.tgz
tar zxf apcu-5.1.8.tgz
phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make
sudo make install

在PHP.ini中添加

extension=apcu.so
apc.enabled=1
apc.enable_cli=1

在WordPress中安装WP LCache插件并启用,在WordPress网站目录下的wp-content中新建一个文件object-cache.php,在其中填入

<?php
$lcache_path = dirname( realpath( __FILE__ ) ) . '/plugins/wp-lcache/object-cache.php';
require_once( $lcache_path );

保存即可生效,之后会发现WP后台的响应速度有可见变化。

一分钟开启Tomcat https支持

1、修改配置文件

打开tomcat/conf/server.xml配置文件,把下面这段配置注释取消掉, keystorePass为证书密钥需要手动添加,创建证书时指定的。

<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
              maxThreads="150"
              SSLEnabled="true"
              scheme="https"
              secure="true"
              clientAuth="false"
              sslProtocol="TLS"
              keystorePass="123456" />

2、创建证书

使用jdk工具类里面的 keytool命令来生成证书,按照提示输入相应的信息。

C:>keytool -genkey -alias https -keyalg RSA
输入密钥库口令:
您的名字与姓氏是什么?
 [Unknown]:  test
您的组织单位名称是什么?
 [Unknown]:  test
您的组织名称是什么?
 [Unknown]:  test
您所在的城市或区域名称是什么?
 [Unknown]:  test
您所在的省/市/自治区名称是什么?
 [Unknown]:  test
该单位的双字母国家/地区代码是什么?
 [Unknown]:  test
CN=test, OU=test, O=test, L=test, ST=test, C=test是否正确?
 [否]:  y
输入 <https> 的密钥口令
       (如果和密钥库口令相同, 按回车):
再次输入新口令:

这里的密钥口令就是配置文件中的 keystorePass配置。

3、访问https

通过 https://localhost:8443/your-project就能访问https项目。

这种方式只适合本地开启https测试,线上环境需要购买商业授权的证书,不过原理都是一样的。

Linux 一台服务器部署多个tomcat

linux系统下安装两个或多个tomcat

编辑环境变量:vi /etc/profile

加入以下代码(tomcat路径要配置自己实际的tomcat安装目录)

##########first tomcat###########

CATALINA_BASE=/usr/local/tomcat
CATALINA_HOME=/usr/local/tomcat
TOMCAT_HOME=/usr/local/tomcat
export CATALINA_BASE CATALINA_HOME TOMCAT_HOME

##########first tomcat############

##########second tomcat##########

CATALINA_2_BASE=/usr/local/tomcat_2
CATALINA_2_HOME=/usr/local/tomcat_2
TOMCAT_2_HOME=/usr/local/tomcat_2
export CATALINA_2_BASE CATALINA_2_HOME TOMCAT_2_HOME

##########second tomcat##########

保存退出。
再输入:source /etc/profile
才能生效。

第一个tomcat,保持解压后的原状不用修改,

来到第二个tomcat的bin目录下
打开catalina.sh ,找到下面红字,

# OS specific support.  $var _must_ be set to either true or false.

在下面增加如下代码

export CATALINA_BASE=$CATALINA_2_BASE
export CATALINA_HOME=$CATALINA_2_HOME

来到第二个tomcat的conf目录下
打开server.xml更改端口:
修改server.xml配置和第一个不同的启动、关闭监听端口。
修改后示例如下:
 

 <Server port="9005" shutdown="SHUTDOWN">                  端口:8005->9005
<!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
    <Connector port="9080" maxHttpHeaderSize="8192"        端口:8080->9080
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
     enableLookups="false" redirectPort="8443" acceptCount="100"
     connectionTimeout="20000" disableUploadTimeout="true" />
<!-- Define an AJP 1.3 Connector on port 8009 -->
    <Connector port="9009"                                  端口:8009->9009
     enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />

分别进入两个tomcat的bin目录,启动tomcat–./startup.sh
http://localhost:8080http://localhost:9080然后访问 和 都可以看到熟悉的tomcat欢迎界面。

将尝试SSH爆破的IP批量添加到hosts.deny

如果有人尝试爆破ssh服务,就会在 /var/log/secure留下错误记录,因此我们可以利用下面的脚本批量添加历史IP到/etc/hosts.deny

#!/bin/bash

#add ip ban list and log the first 1000 lines
#grep "Failed password for invalid user" /var/log/secure | awk '{print $13}' | sort | uniq -c | sort -nr | head -n 1000|
#add invalid user ban list and log the first 100 lines
grep "Failed password for invalid user" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr|head -n 100|

while read a b  
do  
    grep -q $b /etc/hosts.deny
      if [ $? != 0 ] ; then
        if [ $a -ge 5 ] ; then
            echo "sshd: $b" >> /etc/hosts.deny
            fi
      fi
done

使用python 实现自动登录ssh

介绍

本文介绍使用python 自动连ssh,并通过正则处理返回值。

通过这段代码,可以使一些繁杂的工作,变成比较简单以及自动化。

代码

#!/usr/bin/env python

import pexpect
import signal, fcntl, termios, struct, sys

global_pexpect_instance = None

# 当窗口大小有改变时
def sigwinch_passthrough(sig, data):
    # Set terminal size
    if 'TIOCGWINSZ' in dir(termios):
        TIOCGWINSZ = termios.TIOCGWINSZ
    else:
        TIOCGWINSZ = 1074295912
    s = struct.pack ("HHHH", 0, 0, 0, 0)
    a = struct.unpack ('HHHH', fcntl.ioctl(sys.stdout.fileno(), TIOCGWINSZ , s))
    global global_pexpect_instance
    global_pexpect_instance.setwinsize(a[0],a[1])

# 处理返回值,并输入密码
def ssh_password(child,password,other=None):
    global base_path
    ssh_newkey = 'Are you sure you want to continue connecting'
    while True:
        step=[pexpect.TIMEOUT, ssh_newkey, '[pP]assword:.*', '.*[$#] '];
        if other:
            step.append(other);
        i = child.expect(step,timeout=120)
        print "expect:"+step[i];
        if i == 0:
            print child.before,child.befor
            print child.before,child.after
            print 'Time out'
            return False;
        if i == 1:
            child.sendline('yes')
        if i == 2:
            child.sendline(password)
        if i == 3:
            print child.before,child.after
            return True;
    return True;

# 发送命令
def ssh_command(host, user, password, post_command=None):
    global global_pexpect_instance
    print 'ssh -l %s %s'%(user, host);
    child = pexpect.spawn('ssh -l %s %s'%(user, host))
    global_pexpect_instance = child
    signal.signal(signal.SIGWINCH, sigwinch_passthrough)
    if not ssh_password(child,password):
        return None;
    if post_command :
        child.sendline(post_command);
    return child;
# 等待返回,当非字符交互界面时用:如执行命令,等待结束
def ssh_wait(child,other=None):
    step=[pexpect.TIMEOUT,    '.*[$#]'];
    if other:
        step.append(other);
    i = child.expect(step)
    print child.before
    print child.after

# 执行远程登录,如果有命令则直接返回,如果不是执行命令,则进入字符交互界面
def ssh(host,user,password,post_command=None):
    child=ssh_command(host,user,password,post_command)
    sigwinch_passthrough(None, None)
    if child==None:
        return
    if post_command==None:
        child.interact(chr(0x1e)) # ctrl+~
    else:
        ssh_wait(child)

解释

主要思路:

第一步: pexpect 包的spawn 执行ssh 并将用户名和地址填上

第二步:spawn会返回子进程的句柄,通过这个句柄,可以进行发送以及接收返回的字符串

第三步:使用 expect 函数,对返回进行正则匹配

第四步:

expect,会返回命中规则的下标,然后,可以对各种情况进行处理.

比如,在返回 ‘[pP]assword:.*’ 时,发送密码

第五步:

最后,调用interact 进入字符交互界面。然后,就可以手动输入其他命令了。

总结

有了这套工具,可以实现快捷地登录服务器,或者是以另外一种鉴权方式登录服务器(如短信)

比如,我当前的使用是,快捷登录,比如输入 myssh cmky 就可以登录我的服务器了。

相当方便,如果使用linux 还可以和tmux 一同工作。

番外篇:与tmux 一同工作

我们将以上脚本保存为一个叫myssh 的可执行文件,并保存在可执行目录下

我们添加一个脚本,叫tssh :

echo $1
ifattach=0;
tmux -L `whoami` list-sessions
if [[ $? -ne 0 ]]; then
    echo "mytmux";
    ifattach=1;
    tmux -L `whoami` new -d
fi
tmux -L `whoami` neww -n $1 "myssh $1"

if [[ $ifattach -eq 1 ]]; then
    echo "attach"
    tmux -L `whoami` attach
fi

之所以添加 -L whoami 是为了避免在多用户下,公用tmux 而产生的问题。

保证每个用户一个tmux 服务

注意替换 myssh $1 为你自己的命令。

多个 SSH KEY 的管理git

前言

多ssh-key模式 是开发时可能遇到的问题,新手在使用多 ssh key 模式时很容易不知所措。

情景:工作室有一台公用电脑,使用它的开发人员混杂,使用时如何做到不同用户互不影响?如何实现多个ssh-key?如何实现多个ssh-key的配置?如何保证使用正确的私钥验证提交?

github提交验证机制

我们在个人的电脑上使用如下命令可生成ssh key

ssh-keygen -t rsa -C "[email protected]"

这时会在用户根目录下生成一个.ssh文件夹,一个私钥:id_rsa,一个公钥:id_rsa_pub,该公钥和私钥包含了你邮箱的信息,具有随机不可复现性!

ssh公钥私钥同时生成且唯一配对。公钥用于远程主机,私钥存储在本地工作机,私钥用于在push(即write操作)时验证身份。因为公钥与私钥的唯一对应性,只有能和公钥配对的私钥才能对远程主机进行写操作!

每次连接时SSH客户端发送本地私钥(默认~/.ssh/id_rsa)到远程主机进行公私钥配对验证!

同一工作主机,多个ssh key

对于公共电脑,多人使用,解决方案需要做到以下几点:

  • 多个用户ssh key共存,不覆盖
  • 互不影响
  • push时智能地对应的私钥

解决方案:

1. 生成新的ssh key并命名为second

ssh-keygen -t rsa -C "[email protected]" -f ~/.ssh/second

或者

ssh-keygen -t rsa -C "[email protected]"

在询问时定义名称

2. 此时ls出.ssh目录,会发现多了second公钥和私钥

id_rsa 
id_rsa.pub 
known_hosts 
list.txt 
second 
second.pub

3. 远程主机添加公钥

4. 在~/.ssh/目录下新建config文件,用于配置各个公私钥对应的主机

5.

# Default github user([email protected])  默认配置,一般可以省略
      Host github.com
      Hostname github.com
      User git
      Identityfile ~/.ssh/github
# second user([email protected])  给一个新的Host称呼
      Host second.github.com  // 主机名字,不能重名
      HostName github.com   // 主机所在域名或IP
      User git  // 用户名称
      IdentityFile C:/Users/username/.ssh/id_rsa_second  // 私钥路径

注意:

  • 每个邮箱能配置一个公私钥,邮箱是一个重要的身份识别标志
  • 几个主机的命名不能相同;
  • 私钥路径也可以写为 ~/.ssh/…;
  • 如有需要还可以添加Port:xxxx端口配置。

6. 测试连接情况

ssh -T [email protected]

如果,正常的话,会出现如下提示:

Hi USERNAME! You've successfully authenticated, but github does not provide shell access.

如果出现如下提示,则说明有权限问题:
  

Permission denied (publickey)

如果有权限问题的情况下,你对项目执行push操作的时候,会得到如下提示:

Warning: Permanently added the RSA host key for IP address '192.30.252.129' to the list of known hosts.
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

多用户时出现权限问题的原因:

github使用SSH与客户端连接。如果是单用户(first),生成密钥对后,将公钥保存至 GitHub ,每次连接时SSH客户端发送本地私钥(默认~/.ssh/id_rsa)到服务端验证。单用户情况下,连接的服务器上保存的公钥和发送的私钥自然是配对的。但是如果是 多用户 (first,second),我们在连接到second的帐号时,second保存的是自己的公钥,但是SSH客户端依然发送默认私钥,即first的私钥,那么这个验证自然无法通过。

解决ssh权限问题:

通常一台电脑生成一个ssh不会有这个问题,当一台电脑生成多个ssh的时候,就可能遇到这个问题,解决步骤如下:

(1)、查看系统ssh-key代理,执行如下命令

ssh-add -l

以上命令如果输出 The agent has no identities. 则表示没有代理。如果系统有代理,可以执行下面的命令清除代理:

$ ssh-add -D

(2)、然后依次将不同的ssh添加代理,执行命令如下:

$ ssh-add ~/.ssh/id_rsa
$ ssh-add ~/.ssh/second

你会分别得到如下提示:

2048 8e:71:ad:88:78:80:b2:d9:e1:2d:1d:e4:be:6b:db:8e /Users/aysee/.ssh/id_rsa (RSA)

2048 8e:71:ad:88:78:80:b2:d9:e1:2d:1d:e4:be:6b:db:8e /Users/aysee/.ssh/id_rsa (RSA)
2048 a7:f4:0d:f1:b1:76:0b:bf:ed:9f:53:8c:3f:4c:f4:d6 /Users/aysee/.ssh/aysee (RSA)

如果使用 ssh-add ~/.ssh/id_rsa的时候报如下错误,则需要先运行一下 ssh-agent bash命令后再执行 ssh-add …等命令

Could not open a connection to your authentication agent.

(3)、配置~/.ssh/config 文件

如果没有就在~/.ssh目录创建config文件,该文件用于配置私钥对应的服务器

# Default github user([email protected])

Host github.com
HostName github.com
User git
IdentityFile C:/Users/username/.ssh/id_rsa

# aysee ([email protected])
Host second.github.com
HostName github.com
User git
IdentityFile C:/Users/username/.ssh/second

Host随意即可,方便自己记忆,后续在添加remote是还需要用到。 配置完成后,在连接非默认帐号的github仓库时,远程库的地址要对应地做一些修改,比如现在添加second帐号下的一个仓库test,则需要这样添加:

git remote add test git@ second.github.com:ay-seeing/test.git

#并非原来的[email protected]:ay-seeing/test.git
ay-seeing 是github的用户名

(4)、测试 ssh

ssh -T [email protected]

你会得到如下提示,表示这个ssh公钥已经获得了权限

Hi USERNAME! You've successfully authenticated, but github does not provide shell access.

7. 现在开始使用新的公私钥进行工作吧

情景1:使用新的公私钥进行克隆操作

git clone [email protected]:username/repo.git

注意此时要把原来的github.com配置成你定义的second.github.com

  • 情景2:已经克隆,之后才添加新的公私钥,我要为仓库设置使用新的公私钥进行push操作

修改仓库的配置文件:.git/config 为

[remote "origin"]
         url = [email protected]:itmyline/blog.git

即可

之后就照平常一样工作就行啦!