苏苏的博客

简约至极

MySQL性能优化

配置文件

配置文件一般放在/etc/my.cnf 或者 /etc/mysql/my.cnf

默认的配置文件示例存放于/usr/share/mysql

各个文件适配不同内存的配置

文件 内存大小
my-small.cnf <= 64M 不经常开启mysql
my-medium.cnf 32M–64M 经常其他程序搭配mysql
my-large.cnf 512M
my-huge.cnf 1G-2G
my-innodb-heavy-4G.cnf 4GB 使用InnoDB

使用SHOW VARIABLES来查看系统参数,通过SHOW STATUS来判断系统状态

show 命令还有很多用途

命令 描述
show databases 或show tables from database_name 显示mysql中所有数据库的名称
show tables 显示当前数据库中所有表的名称
show columns from table_name from database_name 显示表中列名称
show grants for user_name 显示一个用户的权限,显示结果类似于grant命令
show table status 显示当前使用或者指定的database中的每个表的信息。
信息包括表类型和表的最新更新时间。
show index from table_name 显示表的索引
show status 显示一些系统特定资源的信息,例如,正在运行的线程数量
show variables 显示系统变量的名称和值
show processlist 显示系统中正在运行的所有进程,也就是当前正在执行的查询。
大多数用户可以查看他们自己的进程,但是如果他们拥有process权限,
就可以查看所有人的进程,包括密码
show engies 显示安装以后可用的存储引擎和默认引擎
show innodb status 显示innoDB存储引擎的状态
show logs 显示BDB存储引擎的日志
show warnings 显示最后一个执行的语句所产生的错误、警告和通知
show errors 只显示最后一个执行语句所产生的错误

小内存优化

依据my-small.cnf为模板

主要指标:存储引擎,key_buffer_size,table_cache,max_connections,thread_concurrency,query_cache,thread_stack

存储引擎: 如果不使用 BDB table 和 InnoDB table 的话,加入下面2行关闭不需要的表类型很有必要,关闭 innodb 可以省下大量内存,虽然 InnoDB 好处多多但是在一个64MB的 VPS 上并不能体现出来,并且很占内存。

key_buffer_size: 用来缓存 tables keys 和 indexes,增加这个值可以更好的处理索引,读和写都需要索引,这里设置成16K足够了.优化性能需要key_reads / key_read_requests应该尽可能的低,至少是1:100,1:1000更好,使用show status like 'key_%';查看

table_cache: (5.1.3及以后版本又名TABLE_OPEN_CACHE) 所有线程打开的表的数量,增加值可以增大 MySQL 的文件描述符数量,避免频繁的打开表,原始 my-small.cnf 中 table_cache 设置成4有点小,一个 wordpress 的页面通常会涉及到10个左右的表,其他的程序比如 Drupal,MediaWiki 会涉及到更多,将table_cache改为8。

max_connections: 数据库最大的连接数量,可以根据自己博客/网站的访问量来定这个值,如果博客/网站经常出现:Too many connections 错误的信息说明需要增大 max_connections 的值.

thread_concurrency: 最大并发线程数,通常设置为 CPU核数量×2,在 VPS 宿主机上如果服务器有2颗物理 CPU,而每颗物理 CPU 又支持 H.T 超线程(一个处理器上整合了两个逻辑处理器单元),所以实际取值为4 × 2 = 8。 如果我们在优化 php.ini 的时候设置了同时只有2个 php-cgi 运行的话,那么我们也应该只设置2个 MySQL 线程同时运行,设置过大导致线程之间的频繁切换。

这个参数在mysql 5.6.1中已经被标记为过时,在5.7.2版本的mysql中被移除

query_cache: 对于博客/新闻网站来说,用得最多的就是查询,所以需要加入 query cache 的设置。query_cache_size 是执行查询所使用的缓冲大小。 query_cache_limit指定单个查询能够使用的缓冲区大小,缺省为1M,结果集超过这个大小将不会被缓存。

与查询缓存有关的参数还有query_cache_type、query_cache_limit、query_cache_min_res_unit。

query_cache_type指定是否使用查询缓存,可以设置为0、1、2,分别代表了off、on、demand,如果是0,那么query cache 是关闭的。如果是1,那么查询总是先到查询缓存中查找,除非使用了sql_no_cache。如果是2,那么,只有使用 sql_cache的查询,才会去查询缓存中查找.

query_cache_limit指定单个查询能够使用的缓冲区大小,缺省为1M。

query_cache_min_res_unit是在4.1版本以后引入的,它指定分配缓冲区空间的最小单位,缺省为4K。

检查状态值Qcache_free_blocks,如果该值非常大,则表明缓冲区中碎片很多,这就表明查询结果都比较小,此时需要减小 query_cache_min_res_unit。

thread_stack: 每个线程被创建的时候,mysql分配给它的内存,每个连接使用一个线程,用来存放每个线程的标识信息,如线程id,线程运行时环境等。默认294912(288KB)

sort_buffer_size: 每个需要排序的线程分配的缓冲区大小,增加该值可以加速 order by 和 group by 的操作。注意:该参数是以每个连接分配内存,也就是说,如果有16个连接,sort_buffer_size 为 64K,那么实际分配的内存为:16 × 64K = 1MB。如果设置的缓存大小无法满足需要,MySQL 会将数据写入磁盘来完成排序。因为磁盘操作和内存操作不在一个数量级,所以 sort_buffer_size 对排序的性能影响很大。

read_buffer_size: 顺序读取数据时的缓冲区大小,与 sort_buffer_size 一样,该参数分配的内存也是以每连接为单位的。 当需要顺序读取数据的时候,如无法使用索引的情况下的全表扫描,全索引扫描等。在这种时候,MySQL 按照数据的存储顺序依次读取数据块,每次读取的数据快首先会暂存在 read_buffer_size 中,当 buffer 空间被写满或者全部数据读取结束后,再将 buffer 中的数据返回给上层调用者,以提高效率。

read_rnd_buffer_size: 随机读取数据时的缓冲区大小,与顺序读相对应。

net_buffer_size: 用来存放客户端连接线程的连接信息和返回客户端的结果集的缓存大小。当 MySQL 接到请求后,产生返回结果集时,会在返回给请求线程之前暂存在在这个缓存中,等积累到一定大小的时候才开始向客户端发送,以提高网络效率。不 过,net_buffer_size 所设置的仅仅只是初始大小,MySQL 会根据实际需要自行申请更多的内存,但最大不会超过 max_allowed_packet。

skip-locking用来避免 MySQL 外部锁定,减少出错几率,增强稳定性。

thread_cache_size 优化配置

Thread_Cache是mysql自己维护的连接池,将空闲的连接线程放在连接池中,而不是立即销毁.这样的好处就是,当又有一个新的请求的时候,mysql不会立即去创建连接 线程,而是先去Thread_Cache中去查找空闲的连接线程,如果存在则直接使用,不存在才创建新的连接线程.

thread_cache_size为连接池里最大连接线程数,在短连接的应用中Thread_Cache的功效非常明显,因为在应用中数据库的连接和创建是非常频繁的,如果不使用 Thread_Cache那么消耗的资源是非常可观的!在长连接中虽然带来的改善没有短连接的那么明显,但是好处是显而易见的.但并不是越大越好大了反而浪费资源 依据内存

1G  ---> 8
2G  ---> 16
3G  ---> 32
4G  ---> 64

show variables like 'thread%';show variables like "max_connections";show status like '%connections%';show status like 'thread%';

表3中Connections表示服务器总共服务了多少次连接,Max_used_connections为实际达到的最大并发连接数

表4中Threads_cached是处于连接池中的连接数(休眠的),从表1可以知道连接池允许的最大数量(thread_cache_size)

Threads_connected为当前的连接数,也可以从show full processlist;得知当前的连接数,他的最大值即为Max_used_connections

Threads_running为此时刻正在进行SQL操作的线程,这个值必定是小于等于Threads_connected

Threads_created为总共执行了多少次创建线程的操作,该数定大于等于Max_used_connections,一个线程创建后用于服务,客户端断开后并不会被销毁,而是放入连接池(只有连接池的数量大于设定值才会被抛弃),当创建的时候也会检查连接池内有没有,没有才会创建新的.

配置项max_connections为允许的最大并发连接数,也可以依据Max_used_connections作为参考,增加该值不会占用系统资源,只有实际使用到的才会占用,但设置过小会出现Too many connections,默认值为100,须大于Max_used_connections,根据网站的并发量来设定.

每一个连接都需要一个线程服务,每个线程初始分配thread_stack字节的内存,连接池的利用率为

Thread_Cache_Hit=(Connections-Thread_created)/Connections*100%

即尽量减少线程创建操作.

show variables like '%timeout%';

wait_timeout参数有时也是什么有用,该值为客户端已连接但是未活动,最多等待的秒数,超过此时间将主动断开连接.默认是28800(8小时)

执行show full processlist;可以查看所有连接的状态及空闲时间等.

大量长期Sleep的连接,也是在白白消耗内存,该数量被记为Threads_connected,如果大量创建连接而又不断开不使用,会导致改值增加,达到max_connections上限后会报错too many connections

要改变他,要同时设置interactive_timeout和wait_timeout才会生效

以上: 64M VPS数据库配置

skip-bdb
skip-innodb

key_buffer_size = 16K
table_cache = 8

thread_stack = 64K

max_connections = 16
thread_cache_size = 8
thread_concurrency = 2

query_cache_type = 1
query_cache_size = 4M
query_cache_limit = 128K
query_cache_strip_comments = 1

sort_buffer_size = 64K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
net_buffer_length = 2K
skip-locking

wait_timeout=3600
interactive_timeout=3600

max_allowed_packet = 8M

为性能的优化配置

innodb_buffer_pool_size = 128M
tmp_table_size=64M
key_buffer_size=256M
read_buffer_size=4M
read_rnd_buffer_size=16M
sort_buffer_size=32M
join_buffer_size = 32M
bulk_insert_buffer_size = 32M
myisam_sort_buffer_size = 128M
max_allowed_packet = 32M

如果你的服务器内存较大(4G或更多),专门来跑mysql,可设置key_buffer_size为内存的一半 key_buffer_size = 2048M

连接的并发量不大,还有多余内存可以加大join_buffer_size和sort_buffer_size

sort_buffer_size = 64M
join_buffer_size = 64M

Packet for query is too large

show variables like '%max%'

当update或者insert的内容过大时,max_allowed_packet的值过小,会引起sql异常,需要改大;其默认值为1048576(1M),

修改my.cnf max_allowed_packet = 100M

或者零时动态设置 set global max_allowed_packet = 104857600;

查看是否生效,零时修改一般断开后重新连接即可生效. show variables like '%max_allowed_packet%';

数据库优化

查看query_cache相关配置, 默认这个开关是关闭的,就是禁止使用query_cache query_cache_type 为0,是关闭的

查看当前的配置 show variables like '%query_cache%';

单独查询一个可以使用 select @@query_cache_type;

+------------------------------+----------+
| Variable_name                | Value    |
+------------------------------+----------+
| have_query_cache             | YES      |
| query_cache_limit            | 262144   |
| query_cache_min_res_unit     | 4096     |
| query_cache_size             | 33554432 |
| query_cache_strip_comments   | OFF      |
| query_cache_type             | ON       |
| query_cache_wlock_invalidate | OFF      |
+------------------------------+----------+

上述开启query_cache 32MB

(OFF)如果设置为0,那么可以说,你的缓存根本就没有用,相当于禁用了。

(ON)如果设置为1,将会缓存所有的结果,除非你的select语句使用SQL_NO_CACHE禁用了查询缓存。

(DEMAND)如果设置为2,则只缓存在select语句中通过SQL_CACHE指定需要缓存的查询。

query_cache_size为0,没有分配缓存空间,如果配置了query_cache_size = 4M,这里会显示具体的字节

查看配置及运行的状态 show global variables like '%query_cache%';show global status like '%Qcache%';

+-------------------------+----------+
| Variable_name           | Value    |
+-------------------------+----------+
| Qcache_free_blocks      | 1        |
| Qcache_free_memory      | 26444248 |
| Qcache_hits             | 159619   |
| Qcache_inserts          | 27496    |
| Qcache_lowmem_prunes    | 0        |
| Qcache_not_cached       | 180      |
| Qcache_queries_in_cache | 6922     |
| Qcache_total_blocks     | 13850    |
+-------------------------+----------+

如果Qcache_lowmem_prunes的值非常大,则表明经常出现缓冲不够的情况

如果Qcache_hits的值也非常大,则表明查询缓存使用非常频繁,此时需要增加缓冲大小;

如果Qcache_hits的值不大,则表明你的查询重复率很低,这种情况下使用查询缓存反而会影响效率,那么可以考虑不用查询缓存。

此外,在SELECT语句中加入SQL_NO_CACHE可以明确表示不使用查询缓存。

查询缓存碎片率 = Qcache_free_blocks / Qcache_total_blocks * 100%

如果查询缓存碎片率超过20%,可以用FLUSH QUERY CACHE整理缓存碎片,或者试试减小query_cache_min_res_unit,如果你的查询都是小数据量的话.

查询缓存利用率 = (query_cache_size – Qcache_free_memory) / query_cache_size * 100%

查询缓存利用率在25%以下的话说明query_cache_size设置的过大,可适当减小;查询缓存利用率在80%以上而且Qcache_lowmem_prunes > 50的话说明query_cache_size可能有点小,要不就是碎片太多。

查询缓存命中率 = Qcache_hits / ( Qcache_hits + Qcache_inserts ) * 100%

命中率越高,效果越好

要开启Query Cache可以执行如下,注意Query Cache对于读多写少的场景才会有优势

SET GLOBAL query_cache_type = 1;
SET GLOBAL query_cache_size = 16777216;
SET GLOBAL query_cache_limit = 262144;
SET GLOBAL query_cache_strip_comments = 1;

query_cache_type:开启缓存

query_cache_size:总的缓存大小16Mb

query_cache_limit:结果集超过256KB则不缓存

各个数据库引擎对比

主要讨论引擎: MyISAM存储引擎 InnoDB存储引擎 Memory存储引擎

MyISAM存储引擎

支持B-tree/FullText/R-tree索引类型 锁级别是表锁,表锁的开销小,加锁快;锁粒度大,发生锁冲突的概率较高,并发度低;表锁适合查询 不支持事务性,也不支持外键。

并发不高,不需要支持事务,需要进行全文搜索,读次数大于写次数,适合数据量不是特别大并发不太高的大部分场合

InnoDB存储引擎

支持事务性,支持回滚,支持Hash/B-tree索引类型 锁级别是行锁,行锁在锁定上带来的消耗大于表锁,但是在系统并发访问量较高时,InnoDB整体性能远高于MyISAM。 InnoDB的索引不仅缓存索引本身,也缓存数据,所以InnoDB需要更大的内存。

表数据量超过千万,高并发,频繁更新大字段,安全性和可用性要求高,更适合与大并发大数据量的场合,除了支持事务,在高并发时行级锁的优势就会发挥出来。

Memory存储引擎

内存级的存储引擎,它将所有数据都存储在内存中,所以它能够存储的数据量是比较小的 Memory的锁级别和MyISAM一样,是表锁;并且不支持事务性。

适合与性能要求高数据量小的地方,和缓存的效果类似。

innodb查询表的行数需要全表扫描,速度会非常慢,查询1千万行数据的表最多时要6、7s,而myisam因为保存了总行数是极快的。 在一个进程操作的情况下,myisam的更新和查询速度都会稍快于innodb。memory引擎插入和查询修改的速度都极快,但支持的数据量有限,不支持BLOB/TEXT数据类型,适用于单表几万行数据.

MEMORY表最大值受系统变量 max_heap_table_size 限制,默认为16MB,要改变MEMORY表大小限制,需要改变max_heap_table_size 的值。 MEMORY表写入性能不如InnoDB,读取优于Redis, 更多相关阅读 https://www.v2ex.com/t/303137

读锁:读操作时增加锁,叫共享锁,S-lock特征是阻塞其他客户端的写操作,不阻塞读操作

写锁:写操作时增加锁,叫独占锁或排他锁,X-lock特征是阻塞其他客户端的读、写操作

锁定粒度(范围)

行级:提升并发性,锁定开销大

表级:不利于并发性,锁定开销小

show global status like '%cost%'; 查看上一次查询的代价

show global variables like 'long_query_time'; 查看长查询设定的时间

show global status like 'slow_queries'; –查看查询时间超过long_query_time秒的查询的个数。

分页优化

http://www.cnblogs.com/nnhy/p/BigData.html#!comments 37楼

13456971 行数据 (一千三百万) select * from orderpack order by id limit 13456901,20; 查询约 31.22 秒

修改为2条查询语句

第一条 select id from orderpack order by id limit 13456901,1; 12.80 秒

根据查出来的首条数据的ID,然后查询该页的数据

select * from orderpack where id > 1251083 order by id limit 20; 0.01秒

性能能提升3倍

查看最近执行的sql

1) If general mysql logging is enabled then we can check the queries in the log file or table based what we have mentioned in the config. Check what is enabled with the following command

mysql> show variables like ‘general_log%‘; mysql> show variables like ‘log_output%‘; If we need query history in table then

Execute SET GLOBAL log_output = ‘TABLE’; Execute SET GLOBAL general_log = ‘ON’; Take a look at the table mysql.general_log

If you prefer to output to a file:

SET GLOBAL log_output = “FILE”; which is set by default. SET GLOBAL general_log_file = “/path/to/your/logfile.log”; SET GLOBAL general_log = ‘ON’; 2) We can also check the queries in the .mysql_history file cat ~/.mysql_history

ibdata1文件过大

  1. 需要指定innodb_file_per_table参数,单独保存每个表的数据,否则MySQL的数据都会存放在ibdata1文件里,文件只增加不减小,时间久了这个文件就会变的非常大。

show variables like '%innodb%';查看目前innodb的配置, ON为开启.否则会造成都存储到一个文件内

需要给my.cnf添加一行innodb_file_per_table,记得这个需要在[mysqld]段下面

  1. 可能有长时间执行但未提交的事务.

解决方法可参见 http://blog.fens.me/mysql-ibdata1/

sql

mysql导出数据

导出全部数据

USER=kris
PASS=myPassword
HOST=database-server.mydomain.com

# Databases to exclude
DBEXCLUDE=db_name_i_dont_want

MYSQL=$(mysql -N -u${USER} -p${PASS} -h${HOST} <<<"SHOW DATABASES" | grep -v ${DBEXCLUDE} | grep -v mysql | grep -v information_schema | grep -v test | tr "\n" " ")

mysqldump -v -u${USER} -p${PASS} -h${HOST} --databases  --skip-lock-tables ${MYSQL} > DB-DUMP.sql


mysqldump -uroot -p --all-databases | gzip > sqlfile.sql.gz

mysqldump -uroot -p --databases bureau_datasix_c caascms cas indoor_positioning jeecms ourcat test ucenter | gzip > backup.sql.gz

命令行下具体用法如下: mysqldump -u用戶名 -p密码 -d 數據库名 表名 脚本名;

1、导出數據库為dbname的表结构(其中用戶名為root,密码為dbpasswd,生成的脚本名為db.sql) mysqldump -uroot -pdbpasswd -d dbname >db.sql;

2、导出數據库為dbname某张表(test)结构 mysqldump -uroot -pdbpasswd -d dbname test>db.sql;

3、导出數據库為dbname所有表结构及表數據(不加-d) mysqldump -uroot -pdbpasswd dbname >db.sql;

4、导出數據库為dbname某张表(test)结构及表數據(不加-d) mysqldump -uroot -pdbpasswd dbname test>db.sql;

5.导出数据中dbname多张表(test1,test2,test3)结构及表数据用用空格隔开

mysqldump -uroot -pdbpasswd dbname test1 test2 test3>db.sql;

导出多个数据库,使用 mysqldump -uroot -pdbpassword –databases db1 db2

使用gzip压缩

导出时: mysqldump -uroot -pdbpasswd dbname | gzip > backupfile.sql.gz

导入时: gunzip < backupfile.sql.gz | mysql -uroot -pdbpasswd dbname

使用xz压缩

使用xz压缩会大幅增加导出时间

导出时: mysqldump -uroot -pdbpasswd dbname | xz > backupfile.sql.xz

导入时: unxz -c backupfile.sql.xz | mysql -uroot -pdbpasswd dbname

gzip和xz压缩时后面都可以使用参数-9加大压缩率.但也更耗时.(如果磁盘够用,请不要使用,非常耗时)

同理还可以使用bzip2bzip2 -dc压缩和解压

DELAYED仅适用于MyISAM, MEMORY和ARCHIVE表

replace delayed into

insert delayed into

insert delayed ignore into

查看数据库或某个表的磁盘占用.

https://www.oschina.net/question/12_3673

ffmpeg安装使用

下载官方的静态编译的Linux通用二进制包,同时也包含ARM版本的

ffmpeg

armhf比armel硬件要求,树莓派2可用armhf,树莓派1使用armel

Windows版本也提供编译好的下载

https://ffmpeg.zeranoe.com/builds/

Mac编译好的下载(FFmpeg,FFserver,FFprobe,FFplay)

http://evermeet.cx/ffmpeg/

使用brew安装 brew install ffmpeg --with-ffplay

让ffmpeg转为MP4边下边播

ffmpeg -i input.xx -c copy -movflags faststart output.mp4

-movflags faststart 可修改MP4的moov

关于faststart还有一个python项目,类似于ffmpeg软件包中的qt-faststart https://github.com/danielgtaylor/qtfaststart

可以使用pip install qtfaststart,仅需10KB+

http://blog.chinaunix.net/uid-342902-id-2416123.html

flv to mp4

ffmpeg -i input.flv -codec copy output.mp4 快速转化flv到mp4,高质量转化( only changes container without reencoding )

ffmpeg -i input.flv -c copy -copyts output.mp4 也比较快,高质量转化

ffmpeg -i aaa.flv -c:v libx264 -crf 28 output.mp4 带压缩的转换,非常消耗CPU和时间

更多用法可以参考 http://www.jianshu.com/p/053665062f22

处理m3u8地址视频

下载转码 ffmpeg -i "http://m3u8的地址" -c copy -bsf:a aac_adtstoasc output.mp4

ffmepg -i http://xxx.m3u8 "文件名.mp4"

转化为mp4,需要直到结束,一个文件才能完整.可以使其转化为flv文件

ffmpeg -i “http://xxx.m3u8" -b 8M -r 12 -g 12 output1.flv

ffmepg - i "http://xxx.m3u8" -b 2M out.flv

ffmpeg -i xx.rmvb -c:a copy -movflags faststart output.mp4

ffmpeg 大文件转换为mp4速度很慢通常低配机器是0.5X倍速, 可以转换为flv文件,转换为flv相比转换为mp4速度快很多,一般能3X倍速,还能边转换,边播放

转换为flv,需要设置码率高一些,不然视频画面,严重模糊,设置比特率高些不很影响转码速度

使用-b设置比特率,默认为200Kbit/s,这里改为2048

-r 设定视屏帧率 即 fps

ffmepg -i xx.rmvb -b 2M a.flv

2M 适用于1280X720 普通清晰度. 如果分辨率更大需调整4M 或 6M

ffmpeg 合并 MP4文件 ffmpeg-sound.txt

file 1.mp4
file 2.mp4
file 3.mp4
file 4.mp4

ffmpeg -f concat -i ffmpeg-sound.txt -c copy final_output.mp4

http://askubuntu.com/questions/352920/fastest-way-to-convert-videos-batch-or-single

https://www.zhouchun.net/blog/show/293

mpv 播放多个url

直接 mpv url1 url2 url3 url4 就可以连起来播放

mpv播放URL时,先发送一个Head请求,探测文件大小,

HEAD请求使用的user-agent Mozilla/5.0 (X11; Linux x86_64; rv:10.0) Gecko/20150101 Firefox/47.0 (Chrome)

随后发送GET请求获取数据,使用的User-Agent: mpv 0.26.0.

mpv会读取文件的moov,mdat等信息,可自动处理不是qt-faststart的文件但没有Chrome智能,Chrome浏览器播放视频文件时,也有这个能力.

mpv获取数据是单线程的.

git基本使用

git配置

git config --global user.email "1126045770@qq.com"
git config --global user.name "sucongohu"

git config --global core.autocrlf false
git config --global color.ui true
git config --global credential.helper store

git config --global alias.lg "log --graph --all --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%ci,%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative"
git config --global alias.laststash ="diff stash@{0}^!"

以上分别是设置用户信息,禁止转换换行符,颜色高亮,记住密码,设置别名列出分支图. 设置别名后,可以使用 git lg 查看各个分支关系

设置core.autocrlf false 提交检出均不转换 , 否则同时在Mac,Windows,Linux 跨平台协作开发,eslint 检测换行符错误会很头疼.

http://www.cnblogs.com/sdgf/p/6237847.html

记住密码

if [ ! -f ~/.git-credentials ]; then touch ~/.git-credentials; fi

cat ~/.git-credentials

如果不行,可以手动使用http://user:pass@git.xx.cn 格式写入此文件.

还可以记在内存中,指定有效期 git config --global credential.helper "cache --timeout=3600"

git config credential.helper store 不添加--global 存储在当前项目中

git-for-windows

git config --global credential.helper manager

使用git还经常碰到文件权限发生变化,也显示文件变动了,需要提交,如果你不想将文件权限的变动纳入版本控制可以

git config core.filemode false

对于一些本地和服务器不一致的配置文件,git status每次查看都显示出来,git add -u又会一不小心提交,可以使用 忽略已追踪文件的变动

git update-index --assume-unchanged PATH_TO_FILE

批量操作当前目录下的所有仓库

for i in * ;do cd $i && pwd && git gc; cd -;done;

参数 说明


%H	commit hash
%h	commit short hash
%T	tree hash
%t	tree short hash
%P	parent hash
%p	parent short hash
%an	作者名字
%aN	.mailmap 中对应的作者名字
%ae	作者邮箱
%aE	.mailmap 中对应的作者邮箱
%ad	–date=制定的日期格式
%aD	RFC2822 日期格式
%ar	日期格式,例如:1 day ago
%at	UNIX timestamp 日期格式
%ai	ISO 8601 日期格式
%cn	提交者名字
%cN	.mailmap 对应的提交的名字
%ce	提交者邮箱
%cE	.mailmap 对应的提交者的邮箱
%cd	–data=制定的提交日期的格式
%cD	RFC2822 提交日期的格式
%cr	提交日期的格式,例如:1day ago
%ct	UNIX timestamp 提交日期的格式
%ci	ISO 8601 提交日期的格式
%d	ref 名称
%e	encoding
%s	commit 信息标题
%f	过滤 commit 信息的标题使之可以作为文件名
%b	commit 信息内容
%N	commit notes
%gD	reflog selector, e.g., refs/stash@{1}
%gd	shortened reflog selector, e.g., stash@{1}
%gs	reflog subject
%Cred	切换至红色
%Cgreen	切换至绿色
%Cblue	切换至蓝色
%Creset	重设颜色
%C(color)	制定颜色,as described in color.branch.* config option
%m	left right or boundary mark
%n	换行
%%	a raw %
%x00	print a byte from a hex code
%w([[,[,]]])	switch line wrapping, like the -w option of git-shortlog(1).

一个命令推送到多个服务端vim .git/config ,添加一个区段,例如:

[remote "all"]
        url = https://git.oschina.net/suconghou/mvc.git
        url = https://suconghou@git.coding.net/suconghou/mvc.git
        url = https://github.com/suconghou/mvc.git

以后可以使用git push all master一次推送到多个后端

git clone

git clone https://xxx --branch $BRANCH --single-branch --depth=1

clone 某个分支的最新代码,不要历史记录

git clone -b branch url 使用-b参数,可以clone 指定的分支.

git使用代理

使用代理

git config --global http.proxy http://127.0.0.1:1080
git config --global https.proxy https://127.0.0.1:1080

取消使用代理

git config --global --unset http.proxy
git config --global --unset https.proxy

执行git的时候动态指定

git clone -c https.proxy=socks5://127.0.0.1:1080  https://github.com/me/test.git

使用本地shadowsocks代理

git config --global http.proxy 'socks5://127.0.0.1:1080'
git config --global https.proxy 'socks5://127.0.0.1:1080'

https://segmentfault.com/a/1190000007834504

git回退

当前工作目录的修改都放弃 git checkout .

如果不小心添加了不必要的文件,但是还没有commit,想要撤销添加 git reset FILE_TO_PATH

如果最近的几次的提交完全是错误的,想要放弃,回滚到之前的某一个点继续开发

git reset --hard 要恢复的点HASH 然后 git push -f 强制提交,原先的错误提交将被强制清除,同时团队其他开发人员,也需要重新clone

更好的是 在要恢复的点新建分支,继续开发.

git分支管理

1.创建分支

git branch <分支名>

2.切换到分支

git checkout <分支名>

3.创建一个分支并切换过去

git checkout -b <分支名>

或者

git checkout -b <分支名> master

后面是跟一个master说明创建的develop分支是基于当前的master, 如果当前就在master分支,则可以不写。 如果当前分支HEAD指向的是别的分支,又想基于master分支创建,就必须写master

git new branch from scratch

新建一个孤立的分支 git checkout --orphan <branchname>

清除不必要的数据 git rm --cached -r . && git rm -rf .

总结为

git checkout --orphan newbranch
git rm -rf .
<do work>
git add your files
git commit -m 'Initial commit'

如果版本小于1.7.2 不支持--orphan 可以

git symbolic-ref HEAD refs/heads/newbranch
rm .git/index
git clean -fdx
<do work>
git add your files
git commit -m 'Initial commit'

在没有任何提交之前git branch不会检查到这个分支

更简便的方法新建一个空白的分支

true | git mktree | xargs git commit-tree | xargs git branch branchname

然后直接切换到这个分支,git checkout branchname

新建立的分支无任何文件和提交历史,超级赞!

执行git push --set-upstream origin branchname将新建的分支提交到远程并设置本地分支与远程分支的关联

参考

http://stackoverflow.com/questions/13969050/how-to-create-a-new-empty-branch-for-a-new-project

http://stackoverflow.com/questions/1384325/in-git-is-there-a-simple-way-of-introducing-an-unrelated-branch-to-a-repository

4.分支合并

如:要将develop分支合并和master分支 首先切换的master分支:git checkout master 然后执行合并操作:git merge develop 如果有冲突,会提示你,调用git status查看冲突文件。 解决冲突,然后调用git addgit rm将解决后的文件暂存。 所有冲突解决后,git commit提交更改。

git merge brancha branchb 合并其他分支 到当前所在的分支,当然也可以合并master分支的修改到当前分支

5.删除分支

删除本地分支,删除分支之前记得先合并,以免数据丢失

git branch -d <分支名>

git push [远程名] [本地分支]:[远程分支] 本地分支的数据推送到远程分支,如果远程分支不存在,将会自动创建

如果本地分支为空格,则将删除远程分支 git push origin :deletebranch

等同于 git push origin --delete deletebranch

6.显示所有分支

git branch -a

显示远端分支

git branch -r

git push -all 把所有本地分支都推到远端

git pull origin remotebranch:localbranch 将远程某分支拉倒本地某分支,当本地分支和远程分支名称相同时,只写一个就可以

提交本地指定的分支 到 远程的一个分支

git push origin localbranch:remotebranch (注意,如果本地分支不写,就是删除远程分支的命令)

git tag 管理

1.git tag

在控制台打印出当前仓库的所有标签

2.git tag -l ‘v0.1.*’

搜索符合模式的标签

3.git tag v0.1.2-light

创建轻量标签

4.git tag -a v0.1.2 -m “0.1.2版本”

创建附注标签

git标签分为两种类型:轻量标签和附注标签。轻量标签是指向提交对象的引用,附注标签则是仓库中的一个独立对象。建议使用附注标签。

5.git tag -d v0.1.2

删除标签

6.git push origin v0.1.2

将v0.1.2标签提交到git服务器 git push origin –-tags 将本地所有标签一次性提交到git服务器 通常的git push不会将标签对象提交到git服务器,所以我们需要进行显式的操作:

git stash 操作

1.git stash 可用来暂存当前正在进行的工作, 比如想pull 最新代码, 又不想加新commit, 或者另外一种情况,为了fix 一个紧急的bug, 先stash, 使返回到自己上一个commit, 改完bug之后再stash pop, 继续原来的工作。

git stash
//do some work
git stash pop

2.同样可以使用 git stash save “work in progress for foo feature” 添加标记

3.当你多次使用git stash命令后,你的栈里将充满了未提交的代码,这时候你会对将哪个版本应用回来有些困惑, git stash list 命令可以将当前的Git栈信息打印出来,你只需要将找到对应的版本号,例如使用git stash apply stash@{1}就可以将你指定版本号为stash@{1}的工作取出来,当你将所有的栈都应用回来的时候,可以使用git stash clear来将栈清空。

查看stash与当前的差异

git stash show -p 最新的差异

git stash show -p stash@{1} 指定 stash

git diff stash@{0} master 与与任意版本对比

git diff --name-only stash@{0} master 仅仅查看哪些文件变化

git diff

git diff 默认是工作目录(Working tree)和暂存区域快照(index)之间的差异

查看已经暂存起来的文件(staged)和上次提交时的快照之间(HEAD)的差异

git diff --cached

git diff --staged

显示工作版本(Working tree)和HEAD的差别 git diff HEAD

直接将两个分支上最新的提交做diff git diff topic mastergit diff topic..master

比较上次提交commit和上上次提交 git diff HEAD^ HEAD

比较两个历史版本之间的差异 git diff SHA1 SHA2

git diff HEAD application/config/config.php

diff 还有两种简要形式

git diff HEAD --stat src

git diff HEAD --name-status src

给Git仓库瘦身

使用git gc --aggressive来整理仓库,压缩合并碎片文件能减小仓库大小.

使用git prune 删除一些不会被使用的残留数据,使用git prune -n可以查看将要被删除的数据.

如果想要更加暴力的操作git减小仓库大小,一般使用git-filter-branch,不过操作比较麻烦,可以参考官方的操作 http://git-scm.com/book/zh/v1/Git-内部原理-维护及数据恢复

这里提供一个工具https://rtyley.github.io/bfg-repo-cleaner/

使用这个操作更加方便

下载bfgjar文件,使用java -jar bfg.jar运行,也可以自己写一个alias

首先git clone --mirror 地址

bfg --strip-blobs-bigger-than 10M .

bfg --strip-blobs-bigger-than 1M --delete-files '{*.jar,*.zip,*.gz,*.war,*.jpg,*.png,*.jpeg}'

最后执行git reflog expire --expire=now --all && git gc --prune=now --aggressive

使用du -sh查看最终文件夹大小.

手动清除大文件

git count-objects -v 可以查看git的磁盘使用量

仓库中存在一个idx文件是索引文件 .git/objects/pack/pack-*.idx

从此文件中可查询一些大对象

git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10

使用git rev-list --objects --all可以列出所有 commit SHA 值,blob SHA 值及相应的文件路径

我们两者进行对比就找出了哪些大文件的名字及其SHA,使用下面的命令我们可以一下子得出有哪些大文件.

git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')"

git filter-branch -f --prune-empty --index-filter 'git rm -rf --cached --ignore-unmatch your-file-name' --tag-name-filter cat -- --all
rm -rf .git/refs/original .git/logs/
git gc
git prune
git count-objects -v

git 查找

git grep搜索仓库下的代码,比grep更加快

使用:https://git-scm.com/docs/git-grep

如只在markdown文件中搜索 git grep "make" '*.MD'

git打包

时常我们会使用github或者其他git托管网站的下载zip包功能,下载的压缩包仅包含仓库里的现有文件,不含.git文件夹

那么我们本地的仓库如何做到呢,需要自己使用zip命令自己压缩排除文件吗.

其实git已经自带这个功能了,可以将任意版本的数据导出为压缩包.

将 master以zip格式打包到指定文件git archive --format zip --output /path/to/file.zip master

git archive v0.1 | gzip > site.tgz
git archive master > ./fds.zip

最快捷的直接使用git archive master -o a.tgz

使用 -o a.tgz 或者 a.tar.gz 生成gzip格式的, -o a.zip 生成zip格式的.

git-usage

从源码静态编译git

apk update && apk upgrade
apk add curl gcc g++ make zlib-dev perl
curl https://www.kernel.org/pub/software/scm/git/git-2.10.2.tar.xz | tar xJ
cd git-2.10.2
./configure --prefix=/usr/local --with-curl   CFLAGS="${CFLAGS} -Os -static `pkg-config --static --libs libcurl`"  NO_TCLTK=1 NO_PERL=1 NO_GETTEXT=1
make -j4
make install

svn

svn revert xx.htmlgit checkout xx.html 类似,还原文件的更改

账号文件:/etc/svn-auth-users 密码重置:htpasswd /etc/svn-auth-users conghou.su 新添加用户:同上 删除用户:打开账号文件删除用户所在行即可

修改文件以后需要 service httpd restartsystemctl restart httpd

Sublime使用和设置

配置文件

最喜欢的字体Monaco,此处下载

配置文件 Preferences.sublime-settings

{
	"close_windows_when_empty": true,
	"default_encoding": "UTF-8",
	"default_line_ending": "unix",
	"folder_exclude_patterns":
	[
		".svn",
		".git",
		".hg",
		"CVS",
		"node_modules"
	],
	"font_face": "Monaco",
	"font_size": 14,
	"highlight_line": true,
	"highlight_modified_tabs": true,
	"ignored_packages":
	[
		"Vintage"
	],
	"show_encoding": true,
	"show_line_endings": true,
	"tab_size": 4,
	"translate_tabs_to_spaces": false,
	"update_check": false,
	"word_wrap": false
}

插件

open_browser.py 插件

import sublime, sublime_plugin
import webbrowser
import os

url_map = {
    'D:\\git\\bbs\\' : 'http://127.0.0.3/',
    'D:\\php\\su\\' : 'http://127.0.0.2/',
    'D:\\php\\htdocs\\' : 'http://127.0.0.1/'
}

class OpenBrowserCommand(sublime_plugin.TextCommand):
    def run(self,edit):
        window = sublime.active_window()
        window.run_command('save')
        url = self.view.file_name()
        flag = False
        for path, domain in url_map.items():
            if url.startswith(path):
                url = url.replace(path, domain).replace('\\', '/')
                flag = True
                break
        if not flag:
            cmd1='taskkill /f /im php.exe'
            cmd2='php -S 0.0.0.0:8088 -t '+os.path.abspath(os.path.dirname(self.view.file_name()))
            os.system(cmd1)
            os.popen(cmd2)
            url =  'http://127.0.0.1:8088/'+os.path.basename(self.view.file_name())
        webbrowser.open_new(url)

编译系统

node.sublime-build 执行nodejs代码

{
	"shell_cmd": "node ${file}"
}

快捷键配置

Default (OSX).sublime-keymap

[
	{ "keys": ["alt+d"], "command": "open_dir", "args": {"dir": "$file_path", "file": "$file_name"} },
	{ "keys": ["ctrl+shift+c"], "command": "copy_path" },
	{ "keys": ["ctrl+f11"], "command": "toggle_distraction_free" }
]

添加sublime到命令行

MacOs

ln -s /Applications/Sublime\ Text.app/Contents/SharedSupport/bin/subl /usr/local/bin/sublime

激活码

Sublime Text 3 build 3143 LICENSE

—– BEGIN LICENSE —–
TwitterInc
200 User License
EA7E-890007
1D77F72E 390CDD93 4DCBA022 FAF60790
61AA12C0 A37081C5 D0316412 4584D136
94D7F7D4 95BC8C1C 527DA828 560BB037
D1EDDD8C AE7B379F 50C9D69D B35179EF
2FE898C4 8E4277A8 555CE714 E1FB0E43
D5D52613 C3D12E98 BC49967F 7652EED2
9D2D2E61 67610860 6D338B72 5CF95C69
E36B85CC 84991F19 7575D828 470A92AB
—— END LICENSE ——

3103,3126可用激活码

—– BEGIN LICENSE —–
Ryan Clark
Single User License
EA7E-812479
2158A7DE B690A7A3 8EC04710 006A5EEB
34E77CA3 9C82C81F 0DB6371B 79704E6F
93F36655 B031503A 03257CCC 01B20F60
D304FA8D B1B4F0AF 8A76C7BA 0FA94D55
56D46BCE 5237A341 CD837F30 4D60772D
349B1179 A996F826 90CDB73C 24D41245
FD032C30 AD5E7241 4EAA66ED 167D91FB
55896B16 EA125C81 F550AF6B A6820916
—— END LICENSE ——

3103之前版本可用

----- BEGIN LICENSE -----
Andrew Weber
Single User License
EA7E-855605
813A03DD 5E4AD9E6 6C0EEB94 BC99798F
942194A6 02396E98 E62C9979 4BB979FE
91424C9D A45400BF F6747D88 2FB88078
90F5CC94 1CDC92DC 8457107A F151657B
1D22E383 A997F016 42397640 33F41CFC
E1D0AE85 A0BBD039 0E9C8D55 E1B89D5D
5CDB7036 E56DE1C0 EFCC0840 650CD3A6
B98FC99C 8FAC73EE D2B95564 DF450523
------ END LICENSE ------

SSH

避免SSH自动断开连接

如果有一段时间在SSH连接上无数据传输,连接就会断开,以下设定可以解决这个问题

方案一:在客户端设置

sudo vim /etc/ssh/ssh_config

开启 ServerAliveInterval 60 开启 TCPKeepAlive yes

此后该系统里的用户连接SSH时,每60秒会发一个KeepAlive请求,避免被踢。

方案二:在服务器端设置

sudo vim /etc/ssh/sshd_config

开启ClientAliveInterval 60 开启 TCPKeepAlive yes

如果您只想让当前的 ssh 保持连接,可以使用以下的命令:

ssh -o ServerAliveInterval=60 user@sshserver

ssh隧道

CfNg参数

  • C表示压缩数据传输
  • f表示后台用户验证,这个选项很有用,没有shell的不可登陆账号也能使用.
  • N表示不执行脚本或命令
  • g表示允许远程主机连接转发端口,往往会没有效果,需要修改/etc/ssh/sshd_config添加gatewayports yes

-L本地转发

-L [本地监听IP:]本地监听端口号:目标主机IP:目标端口号 (其中,“本地监听IP”可以省略,省略的话就认为是“0.0.0.0”,但为了安全性考虑,请务必使用“127.0.0.1”做为本地监听端口, 而不要使用默认的“0.0.0.0”。)

ssh -D 8080 user@host SSH会建立一个socket,去监听本地的8080端口。一旦有数据传向那个端口,就自动把它转移到SSH连接上面,发往远程主机。可以想象,如果8080端口原来是一个不加密端口,现在将变成一个加密端口。

ssh -L 2121:host2:21 host3 命令中的L参数一共接受三个值,分别是”本地端口:目标主机:目标主机端口”,它们之间用冒号分隔。这条命令的意思,就是指定SSH绑定本地端口2121,然后指定host3将所有的数据,转发到目标主机host2的21端口(假定host2运行FTP,默认端口为21)。 这样一来,我们只要连接host1的2121端口,就等于连上了host2的21端口。

ssh -CTfNg -L 6300:127.0.0.1:1521 oracle@172.16.1.164

本机的6300端口就是远程主机172.16.1.164的1521端口

-R远程转发

 ssh -CTfNg -R 1521:127.0.0.1:6300 oracle@172.16.1.164

在远程主机172.16.1.164上打开1521端口, 来映射本机的6300端口.

在树莓派上映射ssh到外网

ssh -CTfNg -R 2222:127.0.0.1:22 username@yourvps.com

这样就映射vps的2222端口到树莓派上了.但是这样映射的是服务器的127.0.0.1:2222,外网无法连接这个2222端口

如果你自己的服务器连接时需要端口可以在最后加上 -p port 指定ssh的端口

可以在服务器上执行netstat -anltp查看,这样要先登陆到自己的vps才能通过2222访问树莓派.

可以使用

ssh -CTfNg -R 0.0.0.0:2222:127.0.0.1:22 username@yourvps.com

再在服务器上配置/etc/ssh/sshd_config

#增加下面一句
GatewayPorts yes
#如果有
GatewayPorts no
#则改为
GatewayPorts yes
#然后重启ssh
#centos7: systemctl restart sshd
#centos6: service sshd restart
#ubuntu:   service ssh restart

使用netstat -anltp查看,监听的已经是0.0.0.0了,不过即使你指定-R参数127.0.0.1:2222,也不会监听127.0.0.1而始终是0.0.0.0

若没有netstat可考虑安装yum install lsof net-tools

使用下面的脚本可以保持断开自动重连,可以作为frp穿透的简单替代

需事先配置好ssh免密码登陆

先编写一个可执行脚本,例如 /home/osmc/.autossh

#!/bin/bash
while true; do ssh -CTNg -R 2222:127.0.0.1:2222 -p 23 username@yourvps.com; sleep 5;done;

赋予执行权限 chmod +x /home/osmc/.autossh

编写service文件 使用systemd开机启动

/etc/systemd/system/autossh.service

[Unit]
Description=autossh service
After=network.target network-online.target

[Service]
User=osmc
Restart=on-failure
TimeoutStartSec=0
ExecStart=/home/osmc/.autossh

[Install]
WantedBy=multi-user.target

sudo systemctl daemon-reload sudo systemctl enable autossh sudo systemctl start autossh

sudo systemctl status autossh -l 查看状态 此方法存在缺陷,有时候断开无法连接上,最好还是使用frp

配置frp服务器端

查看 https://github.com/fatedier/frp

服务器端配置文件/etc/frps.ini

[common]
bind_port = 7000
kcp_bind_port = 7000
privilege_allow_ports = 7700,7800-7900
vhost_http_port = 5050
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = 123abc881

网页控制台为7500端口

编写/etc/systemd/system/frps.service文件使开机启动

[Unit]
Description=frps service
After=network.target network-online.target

[Service]
Restart=on-failure
TimeoutStartSec=0
ExecStart=/usr/local/bin/frps -c /etc/frps.ini

[Install]
WantedBy=multi-user.target

sudo systemctl daemon-reload sudo systemctl enable frps sudo systemctl start frps

配置frp客户端

要穿透的代理配置 /etc/frpc.ini

[common]
server_addr = x.x.x.x
server_port = 7000

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 7822
use_compression = true

编写/etc/systemd/system/frpc.service开机启动

[Unit]
Description=frpc service
After=network.target network-online.target

[Service]
Restart=on-failure
TimeoutStartSec=0
ExecStart=/usr/local/bin/frpc -c /etc/frpc.ini

[Install]
WantedBy=multi-user.target

sudo systemctl daemon-reload sudo systemctl enable frpc sudo systemctl start frpc

CentOS6 等没有systemd的系统可以利用/etc/rc.d/rc.local文件开机启动

/usr/local/bin/frps -c /etc/frps.ini > /dev/null 2>&1 &

对于Ubuntu 14.04可以编写脚本放置于/etc/init.d/,并赋予执行权限

frpc 或者 frps 注意自己改写

/etc/init.d/frpc.sh

#!/bin/sh

### BEGIN INIT INFO
# Provides: frp
# Required-Start: $syslog $remote_fs
# Required-Stop:  $syslog $remote_fs
# Default-Start:      2 3 4 5
# Default-Stop:       0 1 6
### END INIT INFO
/usr/local/bin/frpc -c /etc/frpc.ini > /dev/null 2>&1 &
exit 0

sudo update-rc.d frpc.sh defaults 90

重复执行会有提示 System start/stop links for /etc/init.d/frpc.sh already exist.

sudo update-rc.d -f frpc.sh remove

remove 会有提示

 Removing any system startup links for /etc/init.d/frpc.sh ...
   /etc/rc0.d/K90frpc.sh
   /etc/rc1.d/K90frpc.sh
   /etc/rc2.d/S90frpc.sh
   /etc/rc3.d/S90frpc.sh
   /etc/rc4.d/S90frpc.sh
   /etc/rc5.d/S90frpc.sh
   /etc/rc6.d/K90frpc.sh

使用socks5代理

alias socksproxy="ssh -NT -f -C -D 0.0.0.0:1090  -p 1234 root@host";

-D 绑定地址 -N 不打开远程的shell -T 不分配tty -f 后台运行 -C 使用压缩

执行socksproxy后就建立了一条ssh socks5 proxy,本地使用127.0.0.1:1090就可以使用服务器中转流量.

ssh 服务

chkconfig --list可以查看所有服务是否开机启动等.

chkconfig --list sshd可以单独查看sshd服务的启动状态

/var/empty/sshd文件夹是sshd所必须的,不能被删除否则ssh服务将无法启动

chkconfig sshd on将其设置为开机启动

CentOS7 用systemctl取代了service 旧版本的 chkconfig docker on 改为 systemctl enable docker

编译openssh

http://www.openssh.com/ftp.html

在alpine中编译openssh,镜像地址 http://ftp.jaist.ac.jp/pub/OpenBSD/OpenSSH/portable/

编译完成后得到一些工具,如scp,sftp-server,ssh,sshd等等

apk update && apk upgrade
apk --update add make curl gcc g++ zlib-dev openssl-dev
cd /tmp
OPENSSH_VERSION=openssh-7.5p1
CPU_NUM=`cat /proc/cpuinfo | grep processor | wc -l`
curl http://ftp.jaist.ac.jp/pub/OpenBSD/OpenSSH/portable/${OPENSSH_VERSION}.tar.gz | tar xz
cd ${OPENSSH_VERSION}
./configure
make -j$CPU_NUM CFLAGS="-Os" LDFLAGS="-static -L./ -L./openbsd-compat/"  && make install

即可静态编译.

我编译好的二进制文件,能直接用于alpine系统

配合Linuxadduser,可以ssh到docker中

curl -o /usr/local/bin/sshd.xz http://share.suconghou.cn/files/bin/sshd.xz

sshd运行不能直接执行sshd,需要执行/usr/local/bin/sshd

配置文件为/usr/local/etc/sshd_config,同时还需要几个密匙文件.

curl -o /usr/local/bin/sshd.xz http://share.suconghou.cn/files/bin/sshd.xz
xz -d /usr/local/bin/sshd.xz
chmod +x /usr/local/bin/sshd
mkdir -p /usr/local/etc/
touch /usr/local/etc/sshd_config
ssh-keygen -t dsa -f /usr/local/etc/ssh_host_dsa_key -N ''
ssh-keygen -t rsa -f /usr/local/etc/ssh_host_rsa_key -N ''
ssh-keygen -t ecdsa -f /usr/local/etc/ssh_host_ecdsa_key -N ''
ssh-keygen -t ed25519 -f /usr/local/etc/ssh_host_ed25519_key -N ''

添加一个用户:adduser work ,Alpine里是adduser,Linux发行版里是useradd

adduser work -M -N

cat /etc/passwd 可以查看所有用户的列表,只输出用户名可以cat /etc/passwd |cut -f 1 -d :

看第三个参数:500以上的,就是后面建的用户了.其它则为系统的用户.

cat /etc/group 查看用户组

非交互式修改密码可以使用 chpasswd echo "1234" | chpasswd

w 可以查看当前活跃的用户列表

删除用户userdel , 用户userdel -r 用户名,删除用户账户及用户主目录文件

没有外网IP还可以使用ssh建立一个隧道

ssh -CfNg -R 0.0.0.0:2233:127.0.0.1:22 root@yourvps.com -p 27558

编译dropbear

dropbear 是一个更加小巧的sshd

https://matt.ucc.asn.au/dropbear/dropbear.html

cd /tmp
apk update && apk upgrade && apk add wget make gcc g++ linux-headers
wget --no-check-certificate  https://matt.ucc.asn.au/dropbear/releases/dropbear-2017.75.tar.bz2
tar jxvf dropbear-2017.75.tar.bz2 && cd dropbear-2017.75
CFLAGS="-Os -ffunction-sections -fdata-sections" LDFLAGS="-static -Wl,--gc-sections" ./configure --disable-zlib
make -j2

不到一分钟即可编译完成

后台运行 ./dropbear -E -R -m 不进入后台 ./dropbear -F -E -R -m

-m 意味着用户登陆成功后不显示/etc/motd文件内的提示.

dbclient 是一个和ssh类似的客户端

然后linux系统的用户即可通过22端口登陆

CentOS7修改ssh端口

注意:修改ssh端口后,可能还是不能使用,主要原因可能是semanage

使用以下命令查看当前SElinux 允许的ssh端口: semanage port -l | grep ssh

添加xxxx端口到 SELinux semanage port -a -t ssh_port_t -p tcp xxxx 然后确认一下是否添加进去 semanage port -l | grep ssh 如果成功会输出 ssh_port_t tcp xxxx, 22

autossh

sudo yum install gcc make

wget http://www.harding.motd.ca/autossh/autossh-1.4e.tgz
tar zxf autossh-1.4e.tgz
cd autossh-1.4e
./configure && make

zsh

Ctrl + a :移到命令行首 Ctrl + e :移到命令行尾 Ctrl + r:逆向搜索命令历史 Ctrl + g:从历史搜索模式退出 Ctrl + p:历史中的上一条命令 Ctrl + n:历史中的下一条命令

http://jaywcjlove.github.io/handbook/html/Vim%E7%90%86%E8%A7%A3.html

sudo 记住密码时间

mac 系统 在第一次执行sudo命令后,默认情况下密码将持续15分钟,因此您不需要为每个sudo命令键入密码

可以修改 /etc/sudoers 文件配置该时间 使用 sudo visudo 修改此文件

Defaults        env_reset,timestamp_timeout=60

这里设置为1小时

如果要为每个执行的sudo命令输入密码提示,也可以将时间设置为0

音乐标题
歌手