linux在(无root权限,无互联网连接,无pypi源)服务器环境中安装python包

安全性和可用性是反比关系

通过这篇文章,你会学到:

  1. 如何通过非root用户安装python
  2. 如何通过非root用户安装pip
  3. 如何在无互联网的条件下安装python的包
  4. 验证安装成功

1. 如何通过非root用户安装python

  1. 下载源码之后,先进行shasum校验通过。
  2. 解压缩,并执行
    ./configure prefix=/home/username/python
    make install
  3. 然后把路径加到.*rc文件中
    PYTHONPATH=/home/username/python/bin
    export PATH=$PYTHONPATH:$PATH
  4. source .*rc重启,并且通过which python验证是否成功。

参考

2. 如何通过非root用户安装pip

TL;DR

  1. 把pip的wheel文件下载下来。
  2. 执行python pip-9.0.1-py2.py3-none-any.whl/pip install --no-index pip-9.0.1-py2.py3-none-any.whl

Long Version

这个链接中的pfmoore写的答案,注意他提到上面写的这个安装方法没有提供任何warranty。

3. 如何在无互联网的条件下安装python的包

3.1 找到依赖包

应该找一台有互联网的机器,把目前安装paramiko(某个包)所需要的依赖给写下来。通过以下语句:

pip2 download paramiko -d /tmp --no-binary :all:

可以得到以下stdout,然后注意系统提示Successfully downloaded paramiko bcrypt cryptography pynacl pyasn1 cffi six idna asn1crypto enum34 ipaddress pycparser,就是我们需要的包。

Collecting paramiko
  File was already downloaded /private/tmp/paramiko-2.4.0.tar.gz
Collecting bcrypt>=3.1.3 (from paramiko)
  File was already downloaded /private/tmp/bcrypt-3.1.4.tar.gz
Collecting six>=1.4.1 (from bcrypt>=3.1.3->paramiko)
  Downloading six-1.11.0.tar.gz
  Saved /private/tmp/six-1.11.0.tar.gz
......
Collecting idna>=2.1 (from cryptography>=1.5->paramiko)
  Downloading idna-2.6.tar.gz (135kB)
    100% |████████████████████████████████| 143kB 172kB/s 
  Saved /private/tmp/idna-2.6.tar.gz
......
Collecting ipaddress (from cryptography>=1.5->paramiko)
  Downloading ipaddress-1.0.18.tar.gz
  Saved /private/tmp/ipaddress-1.0.18.tar.gz
Collecting pycparser (from cffi>=1.1->bcrypt>=3.1.3->paramiko)
  Downloading pycparser-2.18.tar.gz (245kB)
    100% |████████████████████████████████| 256kB 122kB/s 
  Saved /private/tmp/pycparser-2.18.tar.gz
Successfully downloaded paramiko bcrypt cryptography pynacl pyasn1 cffi six idna asn1crypto enum34 ipaddress pycparser

也可以写成一个shell脚本来下载+列出依赖包

link

#!/bin/sh
# get_pypi_dependencies.sh

PACKAGE=$1
pip download $PACKAGE -d /tmp --no-binary :all: \
| grep Collecting \
| cut -d' ' -f2 \
| grep -v $PACKAGE

执行./get_pypi_dependencies.sh bcrypto,得到:

cffi>=1.1
six>=1.4.1
pycparser

3.2 把这些包的wheel文件下载下来

建议在官网上下载。

  1. 平台版本要选对,windows就选择windows的,linux就是linux的。另外32位和64位要选对。
  2. python2还是python3要选对
  3. 版本要满足最小依赖
  4. cpython和jpython的选择。一般都选择cpython,在安装包上会写成cp27, cp34, cp35, cp36
  5. UCS-2和UCS-4的选择。对于linux版本,可以看到有一个是cp27m版本,一个是cp27mu版本,分别代表了UCS-2和UCS-4.
    • 大部分服务器只能够用UCS-2,用UCS-4安装会报错。
    • UCS-2即UTF-16, 这里的2代表2 bytes,一个byte又是8位,所以总共2^16,可以代表65536个字符。
    • UCS-4即4 bytes per character,2^32, 这个比较耗磁盘空间。
    • 有兴趣可以看看这个讨论

将这些包用SFTP、跳板机等方式传递到离线的服务器上。

然后按照3.1中相反的顺序,通过以下方法安装:

pip install [*.whl]

4. 验证安装成功

执行python,并且import对应的包

5. 其他参考链接

Python的几种安装方式

从日志拿数据(grep, awk, sort, uniq)

解决问题:如何从一份规范化打印的日志中,统计到每一个ID的总个数。

如何统计

我用了don’t starve together游戏服务器中大家的聊天数据,统计出谁说的话最多。(最终业务目标:话说得多的可以考虑给管理员权限。)

grep Say server_chat_log.txt|awk {'print $4'}|sort|uniq -c

  1. 首先grep一把,是为了从众多类型(Say, Join Announcement, Quit Announcement)的日志中通过关键字拿到我想要的日志。语句为:
    • grep Say server_chat_log.txt
    • 也可以用less server_chat_log.txt|grep Say更直观,但是对于大文件,效率不如上面的高。
  2. 然后是分析日志格式,用awk把我想要的field打印出来。这里,开发文档中一般都有日志的格式。另外awk一般以空格作为field separator
    • 我要分析的日志: [16:01:00]: [Say] (KU_qqqqqqqq) 爱烟花的小鱼干: 哇 。可以看到,用户的ID在第4格。
    • 根据awk的格式,用awk '{print $4}'打印出来。
  3. 把所有ID先排序,再统计
    • sort: 排序
    • uniq -c: uniq -c是可以count每一个元素出现的次数。
  4. (Optional)最后把统计结果再排序:
    • sort -n -r: 把统计结果用数字进行排序(-n),然后再倒序排序(-r)。

命令详解

sort

-n: 按照数字排序

-r: 倒序排序

uniq

可以从规范化打印的日志中,找到特定位置的元素,并且统计出相应的数目。需要先使用sort,再使用uniq -c来count所有元素。

Note: ‘uniq’ does not detect repeated lines unless they are adjacent. You may want to sort the input first, or use sort -u without uniq. Also, comparisons honor the rules specified by ‘LC_COLLATE’.

翻译成中文:

在发出 uniq 命令之前,请使用 sort 命令使所有重复行相邻。

日志样例

[15:53:44]: [Say] (KU_xxxxxxxx) 子不语: 小妾。。。
[15:53:54]: [Say] (KU_xxxxxxxx) 子不语: 听着怪怪的。。
DST_Stats|9.331545,6.191408,1.257750,6,8[15:54:40]: [Say] (KU_yyyyyyyy) WaiT: 圣诞树长好就能挂彩灯了
[15:55:18]: [Leave Announcement] 二次元
DST_Stats|7.270835,4.619142,1.153396,5,8[15:55:50]: [Join Announcement] 射命丸
DST_Stats|7.367698,5.289487,0.867764,6,8DST_Stats|7.979237,5.063091,1.189214,6,8[15:57:51]: [Say] (KU_hhhhhhhh) WaiT: 感觉这个树长好要好久头疼
DST_Stats|7.539922,5.255657,0.787640,6,8[15:59:03]: [Say] (KU_hhhhhhhh) WaiT: 你们谁身上还有彩灯
DST_Stats|7.302591,5.121131,0.857226,6,8[15:59:58]: [Say] (KU_hhhhhhhh) WaiT: 姐姐没做避雷针怎么说谁弄
[16:00:18]: [Say] (KU_QQQQQQQQ) Lorzen: 等他上线吧  掉了
DST_Stats|7.112324,5.115301,0.681791,7,8[16:00:46]: [Join Announcement] 1282809699
[16:01:00]: [Say] (KU_qqqqqqqq) 爱烟花的小鱼干: 哇
[16:01:17]: [Say] (KU_QQQQQQQQ) Lorzen: 我都守一天 先让给我吧

ubuntu 16.04的boot区满了,如何删除(缩减版)

Short Version

注意:这个只针对于有经验的认识,你必须清楚你在删什么,不然有重装的风险;如果不清楚,请读Long version

  1. 首先看一下磁盘空间中,/boot分区的空间对不对。我用df -h,看到/boot分区已经100%的使用率。
  2. 然后在/boot分区中,直接删文件。但是注意同类的保持两个不删。
  3. 然后再执行apt-get install -f,安装新的kernel包。
  4. 最后执行apt-get autoremove,删除不用的包。
  5. 最终可以看到/boot分区不再是满的了。
'Filesystem      Size  Used Avail Use% Mounted on
udev            362M     0  362M   0% /dev
tmpfs            77M   13M   64M  17% /run
/dev/sda2        11G  3.0G  7.0G  30% /
tmpfs           381M     0  381M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           381M     0  381M   0% /sys/fs/cgroup
/dev/sda1       361M  151M  192M  44% /boot
tmpfs            77M     0   77M   0% /run/user/1000

参考链接

Long Version

背景

  1. 我想apt-get安装一个包,结果系统一直提醒我”Unmet dependencies. Try ‘apt-get -f install’ with no packages”
'You might want to run 'apt-get -f install' to correct these:
The following packages have unmet dependencies:
 linux-image-extra-4.4.0-92-generic : Depends: linux-image-4.4.0-92-generic but it is not going to be installed
 linux-image-generic : Depends: linux-image-4.4.0-92-generic but it is not going to be installed
                       Recommends: thermald but it is not going to be installed
E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).

Trouble Shooting

  1. 于是我就按照系统提示,运行apt-get -f install,结果系统还是报错,安装不上,提示以下信息。其中重要的是 No apport report written because the error message indicates a disk full error,貌似是磁盘空间满了
Unpacking linux-image-4.4.0-93-generic (4.4.0-93.116) ...
dpkg: error processing archive /var/cache/apt/archives/linux-image-4.4.0-93-generic_4.4.0-93.116_i386.deb (--unpack):
 cannot copy extracted data for './boot/vmlinuz-4.4.0-93-generic' to '/boot/vmlinuz-4.4.0-93-generic.dpkg-new': failed to write (No space left on device)
No apport report written because the error message indicates a disk full error
  1. 接下来df -h,发现果然有一个分区满了,那就是/boot分区,已经100%了。
root@ubuntu:~# df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            362M     0  362M   0% /dev
tmpfs            77M   12M   65M  16% /run
/dev/sda2        11G  5.1G  4.9G  51% /
tmpfs           381M     0  381M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           381M     0  381M   0% /sys/fs/cgroup
/dev/sda1       361M  357M     0 100% /boot
tmpfs            77M     0   77M   0% /run/user/1000
  1. cd /boot之后,再ls可以得到每个文件的大小,得到以下的信息。大概有个印象是要去删除initrd.img,因为它的盘符最大。不确定哪些可以删除,于是参考了这个stackexchange链接

解决方法

接着上面,解决方法是:

  1. 根据apt-get install -f中的no longer required提示The following packages were automatically installed and are no longer required: ,删掉这个列表中对应的/boot分区的文档。
  2. 又因为initrd.img 开头的文档最大(38M),所以删除这个。另外也可以删除对应版本中的vmlinuz, System.map, abi, config等文档。
  3. 其中,至少要保证两个版本的所有类型文档都还保留着,不然等着重装系统吧。
  4. 然后空间够了,就可以重新通过apt-get install -f来安装了。

如何删除文件的英文原文如下原文在这个stackexchange链接

Freeing Up Space on the /boot File System

The Original Poster has a separate /boot partition, and that is what is full and preventing the apt system from working. It will be necessary for him to free up space there.

If there almost enough space, go to /boot and remove a config file or two:

sudo rm config-3.2.0-19-generic-pae

  1. for example, but using the name of one of the kernel versions you intend to remove anyway. This will free up a little space (about 144K apiece).
  2. If you need more space individually remove old vmlinuz initrd, abi and System.map files until you have enough space (about 22 megs for one of my i386 kernel versions).
  3. Whatever you do, don’t remove them all. You should at least keep the latest two matching versions of each kind of file, for each kind of kernel you use.

断后

最后可以做一个apt-get autoremove做cleanup。我竟然删除了1.9G的文件,看来老版本很耗存储空间呢。

GB 22239-2008(等保)阅读笔记

每一个等级的页数:

G1A1S1:4

2:8

3:14

4:15

5:1

可以看到三级和四级的页数最多。

如何进行等级保护分级是GB 17859-1999制定的。

本标准规定了计算机系统安全保护能力的五个等级,即:

第一级:用户自主保护级;

第二级:系统审计保护级;

第三级:安全标记保护级;

第四级:结构化保护级;

第五级:访问验证保护级。

具体可以参考链接

分类

S:保护数据在存储、传输、处理过程中不被泄露、破坏和免受未授权的修改信息安全类要求。

A:保护系统连续正常的运行,免受对系统的未授权修改、破坏而导致系统不可用服务保证类要求。

G(General): 通用安全保护类要求

如何阅读主要条目:

  1. 注意每一个高等级(Lvl 3)的条目,都是在低等级(Lvl 2)条目上附加的。即高等级有的条目,其对应低等级一定有。
  2. 高等级条目中,相对于低等级的新增的新条目,会用加黑的方式表示。

  1. 以下的每一级均已那一级的基准来描述,例如第二级就是S2A2G2,第三级是S3A3G3。实际定级情况下,可能会有不同组合,例如

    第二级组合可能为S1A2G2, S2A2G2, S2A1G2;

    第三级的定级可能S1A3G3, S2A3G3, S3A3G3, S3A2G3, S3A1G3

    . 根据信息系统的定级结果对基本安全要求进行调整。根据系统服务保证性等级选择相应等级的系统服务保证类(A 类)基本安全要求;根据业务信息安全性等级选择相应等级的业务信息安全类(S 类)基本安全要求。 G与定级本身相同,A和S必须有一个等于G。

第一级

技术要求

物理安全

物理访问控制 G1
防盗窃和防破坏 G1
防雷击 G1
防火 G1
防水和防潮 G1
温湿度控制 G1
电力供应 A1
物理位置选择(G2), 电磁防护(S2),防静电(G2)

网络安全

结构安全 G1
访问控制 G1
网络设备防护 G1
安全审计(G2), 边界完整性检查(S2), 入侵防范(G2),
恶意代码防范(G3)

主机安全

身份鉴别 S1
访问控制 S1
入侵防范 G1
恶意代码防范 G1
安全审计(G2), 资源控制(A2)
剩余信息保护(S3)
可信路径(S4)

应用安全

身份鉴别 S1
访问控制 S1
通信完整性 S1
软件容错 A1
安全审计 G2, 通信保密性 S2, 资源控制 A2(会话资源等)
剩余信息保护 S3, 抗抵赖 G3
安全标记 S4,可信路径 S4

数据安全及备份恢复

数据完整性 S1
备份和恢复 A1
数据保密性(S2

管理要求(G1)

安全管理制度

管理制度;制定和发布。

评审和修订(G2)

安全管理机构

岗位设置;人员配备;授权和审批;沟通和合作。

审核和检查(G2)

人员安全管理

人员录用;人员离岗;安全意识教育和培训;外部人员访问管理。

人员考核(G2);

系统建设管理

系统定级;安全方案设计;产品采购和使用;自行软件开发;外包软件开发;工程实施;测试验收;系统交付;安全服务商选择。

系统备案(G3);等级测评(G3)

系统运维管理

环境管理;资产管理;介质管理;设备管理;网络安全管理;系统安全管理;恶意代码防范管理;备份与恢复管理;安全事件处置。

密码管理(G2);变更管理(G2);应急预案管理(G2)

监控管理和安全管理中心(G3)

第二级(只看在前两个基础上新增的控制小类)

技术要求

主要会增加安全审计资源控制XX保密性

物理安全

物理位置选择 G2
防静电 G2
电磁防护 S2

网络安全

安全审计 G2
边界完整性检查 S2
入侵防范 G2

主机安全

安全审计 G2
资源控制 A2

应用安全

安全审计 G2
通信保密性 S2
资源控制 A2

数据安全及备份恢复

数据保密性 S2

管理要求(G2)

系统建设管理

其中系统定级中,明确要求应该明确信息系统的边界和安全保护等级,并以书面形式说明信息系统确定为某个安全保护等级的方法和理由;且结果经过相关部门的批准。

第三级

Google voice是什么

Google Voice其实是google提供的一个VoIP服务,这个服务在很多年前就有,只是因为当时大家还没有掌握如何拥有美国IP的方法,所以没有申请。目前,很多人都掌握了拥有美国IP的方法,并且目前又有使用美国电话的诉求。比如某套路云的美国节点要求美国IP注册,然后那个套路云又比AWS便宜。

其实对于运营商来说,google voice是一个很有潜力的竞争对手(在欧美等喜欢用voicemail的国家)。优点:voicemail和文字邮件互换;cheap international call; easy conference call。

可以通过以下链接看到google voice宣传的功能:

https://www.google.com/googlevoice/about.html#tab=overview

缺点:这个在中国用不了,所以大家很多也是用来申请一个做备份的。

macOS上网速变慢原因排查及解决方案

 

起因

在之前跟家人聊天,通过apple的photos软件翻了一下原来的老照片,共享了其中的一些照片给家人看。

聊天之后开始下载一部美剧,发现速度奇慢,只有30KB/s,遂觉得不对劲,一定有什么后台进程。

工具

macOS上的命令行工具:nettop

一看这个名称,就知道这个是跟linux的top equivalent的工具。以下是使用概要。

  1. 直接在终端输入:nettop
  2. 注意nettop有以下选项,均可以通过在nettop界面中通过点击的方式:
    • p:换成人类易读模式。即通过KB, MB来表示,而不是全部是bytes。
    • d:delta。即切换为显示当前的增量,这样能够找到在这一秒内下载最多的程序。
  3. 另外,以下命令可以看到流量在网络TCP/IP层是怎么走的,相当于网络的traceroute。

nettop -m route

macOS上的图形工具:Activity Manager

Activity Manager里面的网络tab,也能够看到每个进程的网络占比。但缺点是没有delta选项,即不容易通过增量单独来看。

元凶:nsurlsessiond。苹果的Photos同步进程

找到一个占了200KB/s的线程:nsurlsessiond

查google得知这个是macOS的photos应用的云同步进程。

只要知道怎么关闭这个云同步就行。

解决方案

  1. 打开photos应用,点击Preference
  2. 打开icloud页签,能够找到iCloud Photo Library,发现其中有N百张照片在下载。
  3. 点击暂停一天即可。
  4. 然后我的下载器的速度就恢复了。

Linux的文件系统层次结构标准(浓缩版)

由于经常使用linux,想要系统看看linux的各个distribution的文件层次结构是什么样的,所以去linux找了一个3.0的FHS(Filesystem Hierarchy Standard)来看,并且把其中重要的部分翻译成了中文,适合快速了解linux的文件系统。以下:

1.这个章节包含了根目录的层级结构,以及/usr目录的层级结构。

https://c4fun.gitbooks.io/linux-unix/content/FHS101.html

2.这个章节包含了/var的目录层级结构。

https://c4fun.gitbooks.io/linux-unix/content/fhs201var.html

 

 

HTTP 基础概念&常用的命令

基本概念

定义

HTTP是OSI的应用层(7层)的一个response-request协议。一个HTTP服务器会监听某个指定端口来的client request,然后server根据Request做出反馈。默认端口80.

握手

  1. 另外HTTP建立连接有三次握手,分别是:客户端发起SYN, 服务器发起SYN+ACK, 客户端发起ACK。
  2. HTTP断开连接有四次握手:客户端发起FIN,服务器发起ACK,服务器发起FIN, 客户端发起FIN。

返回状态码

2XX:good

3XX:重定向

4XX:客户端错误

5XX:服务器端错误

linux中常用命令

telnet

这是一个不安全的协议,但是可以用来测试连接有效性。

$ telnet www.opsschool.org 80
GET /en/latest/http_101.html HTTP/1.1
Host: www.opsschool.org

Trying 162.209.114.75...
Connected to ops-school.readthedocs.org.

cURL

cURL是一个使用URL语法来传输数据的工具。比Telnet强大的点是:cURL可以创建HTTP Request(即可以指定GET, POST, HEAD等方法),

  1. 例如以下:
  • –request 指定方法为GET
  • -I 即只输出header
$ curl -I --request GET  http://www.opsschool.org/en/latest/http_101.html
HTTP/1.1 200 OK
Server: nginx/1.4.6 (Ubuntu)
Date: Tue, 23 Jun 2015 20:42:25 GMT
Content-Type: text/html
Content-Length: 140673
Last-Modified: Wed, 27 May 2015 12:16:25 GMT
Connection: keep-alive
Vary: Accept-Encoding
ETag: "5565b599-22581"
X-Served: Nginx
X-Subdomain-TryFiles: True
X-Deity: chimera-lts
Accept-Ranges: bytes

2. 对于大文件,可以使用-O选项来显示进度

然后会显示以下的进度:


  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  4  467M    4 20.2M    0     0   116k      0  1:08:15  0:02:57  1:05:18 71532
3. 如果curl碰到重定向,而你想把这个重定向继续跟踪下去,使用-L选项
$ curl -IL www.opsschool.org
HTTP/1.1 302 FOUND
Server: nginx/1.4.6 (Ubuntu)
......

HTTP/1.1 200 OK
Server: nginx/1.4.6 (Ubuntu)
.......

netcat

Netcat是一个可以建立HTTP连接,并且实现读写数据的工具。netcat可以作为服务器端或者客户端。

在很多地方,直接用nc这个简称指代netcat。

做一个简单的client/server

  1. 可以通过-L选项告诉netcat监听某个端口,造一个服务器端。
$ nc -l 192.168.0.1 1234 > output.log

以上命令告诉某台机器通过1234监听消息,听到的消息传递给output.log。注意IP地址改为该机器的IP地址。

2. 用客户端连接服务器,并且输入信息

$ echo "I'm connected as client" | nc 192.168.0.1 1234

3. 然后在服务器端可以看到输出:

$ cat output.log
I'm connected as client

可以做一个简单的聊天器

上面的命令如果不输出到文件,可以做及时聊天,只要:

  1. 服务器端
$ nc -l -p 1234

2. 客户端

$ nc 192.168.0.1 1234

然后就可以愉快的聊天了

作简单的HTTP服务器(比较危险,如果不懂网络安全,不要轻易尝试)

Netcat连接建立之后,可以执行命令或者脚本

netcat有一个traditional的版本,其中有DGAPING_SECURITY_HOLE这个选项,可以使用-e <program/shell_script.sh>来执行命令。

那么如何建立这个简单的HTTP服务器呢?

  1. 定义一个文件httpd.sh
  2. 然后在服务器端,通过这个命令来launch
$ while true; do netcat -lp 1234 -e ./httpd.sh; done

然后服务器端就已经在1234端口监听了。

3. 在客户端通过不同的HTTP命令连接,可以看到反馈

$ curl 192.168.0.1:1234/
<html>Hello there world!</html>

$ nc 192.168.0.1 1234
GET /notexisting.html HTTP/1.1

最后注意:一定要在服务器端把服务关闭

以上文章来源:opsschool

rsync, scp远程机器的文件拷贝到本地+部分拷贝+指定端口

记得还是VPS小白的时候,只懂得怎么按照教程一步步建立ss。

后来发现用VPS进行torrent下载很快,不用一直占用我的电脑,只要在空闲的时候再拷贝回自己的电脑就行。

那么,

如何把VPS上的文件拷贝到本地电脑呢?

rsync命令

  1. rsync可以实现保存部分文件,通过-P选项。所以比较适合大文件的下载。
  2. rsync的-e选项可以调用另外的remote shell,所以可以实现用ssh安全下载,并且还可以使用ssh命令的-p指定端口,所以可以应对VPS改了端口的场景。

综上所述,针对于我的使用命令

rsync -P -e "ssh -p 2234" my_username@my_ip_addr:/home/remote_files /local/path

scp命令

命令很简单,scp顾名思义就是使用了ssh的cp(copy命令),所以可以从远程拷贝文件。

由于使用了ssh,所以有以下两点需要满足:

  1. 远端主机的端口号需要正确。
  2. 需要输入对应用户名以及密码。或者已经对这个用户名建立了一个公私钥配对。

具体就不举例了,详见这个链接中的描述