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的文件,看来老版本很耗存储空间呢。