Linux运维指南

6 minute read

Published:

Linux运维技巧

Q: Python pip下载第三方库速度太慢

A:

pip install <pkg-name> -i https://pypi.tuna.tsinghua.edu.cn/simple

Q: 终端连接服务器总是断开?

A:

sudo vi /etc/ssh/sshd_config

将【ClientAliveInterval 0】改为 【ClientAliveInterval 30】

将【ClientAliveCountMax 3】 改为 【ClientAliveCountMax 86400】

sudo service sshd restart

Q: Ubuntu无法使用jps命令

A:

ubuntu下没有jps命令:安装openjdk-17-jdk-headless解决(具体版本依据服务器的java版本确定


Q: 无法访问hadoop启动的网页

A:

因为默认开启了防火墙

CentOS:
sudo systemctl disable firewalld.service
service network restart

Ubuntu:
sudo ufw disable
reboot

操作结束后即可通过网页访问


Q: ssh无法连接远程服务器(192.168.199.1)

A: 无法连接服务器可能是因为ssh的端口被block,因此需要从物理管理端口iBMC进入服务器:用KVM软件登录【192.168.30.115】,用/密【root/g______h】 切换到root用户,关闭ufw防火墙:【ufw disable】,并【reboot】重启即可


Q: 更改CentOS的IP地址

A: CentOS的IP地址可以通过【ip addr】来设置。

网卡配置文件在【/etc/sysconfig/network-scripts】中,如果网卡是eth0,则编辑【vi ifcig-eth0】,进入文件。

假设要修改的IP为【192.168.199.1】,则修改:

BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.199.1
GATEWAY=192.168.199.254
NETMASK=255.255.255.0
DNS1=8.8.8.8
DNS2=119.29.29.29

最后输入

sudo service network restart

重启服务


Q: 如何在服务器A上免密登录服务器B

A: 在A上运行ssh-keygen,在~/.ssh/下找到id_rsa.pub,将其上传到 服务器B的~/.ssh/authorized_keys文件末尾


Q: bash脚本单引号和双引号的区别

A: 单引号显示的是【纯文本】,而双引号会显示引号内的【变量】对应的值

例如:

echo '$LANG' 与 echo "$LANG"

前者显示的是”$LANG”,后者显示的是”zh-CN”


出现cleanMyMac删除不掉的软件怎么办

在终端输入【topgrep CCX】,其中CCX代表着软件删不掉的软件;

然后看到进程号,如822,在终端输入【kill -9 -822】即可。

然后用cleanMyMac删除该软件即可。

配置Crontab的常见问题

  1. 直接执行bash文件,需要加上755权限,以及在文件第一行加上【#!/usr/bin/bash】
  2. sendmail: fatal: parameter inet_interfaces: no local interface found for ::1问题解决链接
  3. 脚本、crontab中命令尽量写绝对路径
  4. 脚本内要添加source bashfile

git clone 下载慢的方法

将clone后的github.com改为github.com.cnpmjs.org。

例如:

git clone https://github.com.cnpmjs.org/lidingruc/2019R.git

速度能变快。

其余修改DNS等方法效果不好,不知道为什么。更好的解决方案就是用梯子翻墙。

Homebrew在update的时候遇到问题的解决方案

如果执行brew update时提示报错:homebrew-cask is a shallow clone

则命令行运行

```rm -rf /usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask rm -rf /usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask brew update


即可。

## bash下所有命令失效

原因:错误更改了环境变量,导致命令无法在路径中找到。

解决方法:在终端更改PATH变量:

```shell
PATH=/bin:/usr/bin:/usr/local/bin:$PATH

然后当前环境下就可以使用/bin、/usr/bin、/usr/local/bin下的命令了,如果有必要,可以把/sbin、/usr/sbin、/usr/local/sbin加上去,这样方便重启(reboot)

回头再在/etc/profile配置文件中修改PATH即可(这个文件前半部分是添加bin、sbin等必要命令;后半部分是添加用户自己下载软件的二进制文件路径)

VMWare Tools安装方法

以windows虚拟机为例,先在工具栏找到CD/DVD(SATA),然后选择“选择光盘或光盘映像”,在跳出的isoimages文件夹中找到windows.iso文件(该文件夹下还有诸如linux.iso文件等等)

提示dmg文件已经损坏

在终端输入以下代码以实现允许所有来源的软件运行:

sudo spctl --master-disable

输入以下代码以实现只允许来自苹果的软件运行:

sudo spctl --master-enable

对于单个软件,需要将其拖动到桌面,然后在终端输入以下代码:

sudo xattr -r -d com.apple.quarantine <$appname.app>

XCode: command + R 编译并运行程序

终端字体变大:command+’+’

终端字体变小:command+’-’

ls: 显示当前路径下的所有文件和文件夹

cd: 将当前路径跳转到……文件夹/文件

cd .. 跳转到上一级路径

pwd: 显示当前路径

ls -l: 显示文件夹的详细信息

man ls: 显示ls命令的帮助文档

history: 查看历史终端命令(即自己曾经输入过的命令)

ls -a: 显示目录下的所有子目录和文件,包括隐藏文件。

ls -h: 配合-l以人性化的方式显示文件大小

touch …:创建一个文件在当前目录

ls *.py: 显示以后缀为.py的所有当前目录下的文件

ls 和 ls * 等价

*:表示一个或多个字符

?:表示一个字符

例子:ls *.p?

[]: 表示匹配中括号内的任意一个字符

例子:1[23]3 可以匹配123\133

例子:1[1-9]3 可以匹配113到193的九个字符串

ls a-f 寻找的是a-f为名字的文件!在中括号外,-将失去通配的作用

*.a 匹配的是所有以.a为后缀的文件,但是

*.a匹配的只有*.a,\是转义符

开启编辑器:gedit example.txt

cat example.txt :显示文件内容

more example.txt: 一页一页显示文件内容

AB: 一个命令的输出可以通过管道作为另一个语句的输入。

即:从A读,写入B

例子:ls -lhamore

cd ~ : 跳转到根目录(/walden)

cd _: 跳转到上次所在的目录

A > B: 将B中的内容替换为A

A » B : 将A的内容补充到B的末尾

例子:ls -lha > ls.txt: ls.txt内容为当前目录下的文件列表名称

例子:ls -lha » ls.txt: 在ls.txt后补充当前目录下的文件列表名称

touch 创建一个文件(不一定要在当前目录,可以使用相对、绝对路径)

例子:touch ./myself/123.py

mkdir 创建一个目录(文件夹)

rmdir 删除一个目录(文件夹):注意:只允许删除空的文件夹!

rm 删除一个文件(无法删除目录!)

rm my_document -r : 删除文件夹及文件夹下的所有文件

rm -f: 强制删除,忽略不存在的文件,无需提示

rm -rf: 上两句的结合

创建快捷方式: 命令:ln 源文件 链接文件 (硬链接) 或: ln -s 源文件 链接文件 (软链接)

软链接:源文件删除后,链接文件打不开。

硬链接:源文件删除后,链接文件能打开(但修改源文件时,链接文件也会随之改变)。硬链接相当于给一个文件添加另一个名字。当rm命令删除该文件时,改成删除其一个名字。当最后一个名字被删除后,这个文件就被真正删除。

文件的合并与重定向: cat A.py B.py > C.py 则C.py的内容为A的内容(靠前)+B的内容(靠后)

文件内搜索:用grep grep -option ‘string’ A.py 在A.py中搜索string字符串(字符串可以正则) option: -n: 搜索后显示目标字符串所在行数

find 操作:搜索特定目录下符合条件的文件

find 路径 -name A.py

cp: 将文件或目录 复制到另一个文件夹中 例子:cp A.py test/ 如果把文件夹复制到另一个文件夹中,需要在命令后加 -r 例子:cp test/ test2/ -r cp -v: 显示复制进度

mv: 剪切或重命名 mv A.py test/ 即把A.py剪切到test文件夹中 如果要把文件夹复制到文件夹内,需要加-r 如果mv后跟的两个命令没有文件夹,则 mv A.py B.py 即把A.py的名称改为B.py

tar [] 打包文件名 文件 将指定文件打包成一份文件夹(没有压缩) gzip 可以将tar后缀的文件压缩,变为.tar.gz的格式

gzip -d: 解压

tar -zxvf: 既打包,又压缩

tar -xvf: 解压tar文件夹

压缩文件:zip 解压文件:unzip

查看命令位置:which

终端下,如果是$符号,就是普通用户。如果需要转成管理员,则输入: sudo -s 再输入密码,就是管理员了。此时不是$,而是#符号。

date: 显示当前时间

ps: 查看进程信息

exit: 从管理员退出,回到普通用户身份

control(^) + C : 强制结束当前终端的进程(进程,即正在运行的程序)

kill 12345: 结束编号为12345的进程

kill -9 12345: 强制结束编号为12345的进程

reboot: 重新启动

shutdown: 关机(与reboot一样需要管理员(#)权限)。shutdown后可以加-h,指定关机时间

top: 显示当前资源的利用率的情况

df: 查看磁盘空间

du: 查看当前目录下的空间

ifconfig: 显示网络接口卡(可以查看自己的ip地址)

ping: 测试远程主机连通性。ping + ipv4地址

who: 查看登录的用户

whoami: 查看正在操作的用户

ssh: 远程登录电脑

passwd + [user]: 更改用户的密码

su - [user]: 切换到该用户(需要输入密码),此时目录也迁移过去了

useradd [name] -m: 添加用户,到当前列表

cat /etc/group : 查看有哪些用户组(显示/etc/group下的文件内容)

groups [username: walden] : 显示指定用户账户的组群成员身份

groupmod: 查看群组

groupadd: 添加一个群组

usermod -a -G [sudo] [username]: 将user添加到sudo群组中

chmod: 更改文件权限。例子:chmod o+w 1.py: 把其他用户对1.py的权限增添“可写” u: 文件所有者;g: 同组用户;o: 其他用户 另一种方法:r:4,w:2,x:1,-:0

chmod 751 [filename]: 所有者用户:可读可写可执行;同组用户:可读可执行;其他用户:可执行

cat: 读;

vi: 写;

./[filename]: 执行

gcc + [filename]: 编译文件

修改文件所有者: chown [user] [filename]

修改文件的所属组:chgrp [groupname] [filename]

scp a.txt 192.168.21.188:/home/python/Desktop 把本地文件上传到服务器指定目录下

scp 192.168.21.188:/home/python/Desktop/b.txt ./ 把服务器上路径的文件拷贝到当前目录下

在vim模式下, :wq 保存且退出 :x 保存且退出

运行python程序的方法:python a.py 或 python3 a.py

使python支持中文:代码前加#encoding = utf-8

修改Mac应用图标

将图标命名为xxx.png,并将图片尺寸修改为1024x1024.假设该图标在Dir文件夹下。 在Dir文件夹下,创建临时目录Hexchat.iconset, 然后在终端输入以下指令:

sips -z 16 16     xxx.png --out Hexchat.iconset/icon_16x16.png
sips -z 32 32     xxx.png --out Hexchat.iconset/icon_16x16@2x.png
sips -z 32 32     xxx.png --out Hexchat.iconset/icon_32x32.png
sips -z 64 64     xxx.png --out Hexchat.iconset/icon_32x32@2x.png
sips -z 128 128   xxx.png --out Hexchat.iconset/icon_128x128.png
sips -z 256 256   xxx.png --out Hexchat.iconset/icon_128x128@2x.png
sips -z 256 256   xxx.png --out Hexchat.iconset/icon_256x256.png
sips -z 512 512   xxx.png --out Hexchat.iconset/icon_256x256@2x.png
sips -z 512 512   xxx.png --out Hexchat.iconset/icon_512x512.png
cp xxx.png Hexchat.iconset/icon_512x512@2x.png

生成icns文件:

iconutil -c icns Hexchat.iconset

如果要删除,则

rm -R Hexchat.iconset

接下来,找到要修改的应用,显示简介:

command + i

将刚才生成的Hexchat.icns拖入其中即可。

python在终端打印带颜色的print

print("\033[0;37;40m\tHello World\033[0m")

格式:

开头部分:\033[<显示方式>;<前景色>;<背景色>m + 结尾部分:\033[0m

从零开始配置阿里云服务器

1. 购买服务器 & 基础配置

首先在阿里云注册,买一个最低配的服务器,花费96元。我买的是CentOS 8.2版本,记下公网IP,更改密码。

然后为了防止ssh上之后挂机自动掉线,修改【/etc/ssh/sshd_config】文件,找到ClientAliveInterval两行(可以用/Client指令定位)

image-20210312201127731

保存退出(:wq),并重启服务即可:

systemctl restart sshd.service

注意到我们的主机名(也就是命令行@后的字符串)挺难看,因此我们可以在/etc/hostname文件中修改:

vi /etc/hostname

按【dd】删除,然后写上自己喜欢的称呼即可(此部分为配置好环境后才补充的,因此下文截图中可能尚未更改主机名)。最后输入:

reboot

安全重启服务器,才能将刚才的改动更新到内核中。重启和注销(exit)不一样,重启后需要等待一段时间才能重新连上服务器。

BTW,我们使用termius软件管理服务器,并可以利用SFTP协议可视化地传文件,非常方便!

2-1. 开发工具(python)配置

(此部分参考配置教程

首先安装python,切换到~目录,并在命令行执行:

wget https://www.python.org/ftp/python/3.8.3/Python-3.8.3.tgz
tar -xvf Python-3.8.3.tgz

(虽然现在的python版本已经迭代到3.9了,但我还是比较喜欢3.8的版本)

然后安装必要的依赖:

yum install -y gcc zlib zlib-devel openssl-devel readline readline-devel libffi-devel bzip2-devel mesa-libGL.x86_64 xz-devel

(注意这个libffi-devel是必须要安装的!否则将来安装跨编程语言的第三方包时,会出现混合编程报错_ctypes模块缺失的错误。如果出现了错误,则yum安装libffi-devel,然后重新编译python【参考下文的步骤,依旧不能遗漏–prefix选项参数!】)

(mesa-libGL.x86_64是cv2的一个附属包,不安装会报错,安装后不用重新编译python)

(xz-devel是lzma的C语言依赖库)

下载后需要编译,执行以下命令:

cd Python-3.8.3/
./configure --prefix=/usr/local/python3Dir
make
make install

为刚刚下载的python3.8创建软链接,这样可以把两个bin目录关联起来,今后就可以调用/usr/bin下的python3命令了。

cd /usr/bin
ln -s /usr/local/python3Dir/bin/python3 /usr/bin/python3

在当前目录(/usr/bin)检查一下:

ll -a python*

image-20210315185900343

最终成果:

image-20210315190014646

Q:为什么不将python3.8连接到python指令?

A:改掉python的软链接会出现很多问题,有些python2的文件是用python引用的,因此若改掉【python】指向的二进制文件,则这些脚本可能会出问题。例如yum软件是引用python指令作为PYTHONPATH,且基于python2,若改为python3.x,则无法编译通过。

当然,在编写程序使用vim的时候,我个人是喜欢开启行号的。如果需要自定义配置,则新建一个~/.vimrc文件:

vi ~/.vimrc

写入:

set tabstop=4
set softtabstop=4
set shiftwidth=4
set autoindent
set cindent
set cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,>1s,=1s,:1s
set nu
set ruler
set hlsearch
set backspace=2
syntax enable
set background=dark
:colorscheme molokai

保存退出。这样每次使用vim命令时都会使用.vimrc中的配置。

molokai.vim主题文件可以在github上下载,然后放在【~/.vim/colors】文件夹下。


2-2. git配置

先在【https://github.com/git/git/archive/v2.17.0.tar.gz】上下载git(v2.17),然后用SFTP传到服务器上,然后解压并进入目录:

tar -xvf git-2.17.0.tar.gz
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker
yum remove git 
cd git-2.17.0/
make prefix=/usr/local/git all
make prefix=/usr/local/git install 

然后在/etc/profile中,最后一行加入:

export PATH=$PATH:/usr/local/git/bin

保存并退出,然后执行:

source /etc/profile

2-3. Shell配置

首先安装zsh:

sudo yum install -y zsh

然后检查一下是否安装成功:

cat /etc/shells

image-20210312232152161

下载oh-my-zsh(因为我喜欢它的界面,哈哈,不喜欢的读者朋友们可以跳过此步~):

curl -L https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh | sh

完成界面如下:

image-20210316115226115

更改默认shell:

chsh -s /bin/zsh

更改配置文件.zshrc:

vi .zshrc

image-20210316115540820

找到ZSH_THEME变量,将其改为random(参考14行的注释说明)

exit退出后重新登录服务器,可以看到通过上文更改默认shell为zsh,同时配置了随机的主题风格后,每次都有全新的主题终端。

image-20210316120017074

2-4. 包管理

CentOS下的包管理用yum就行了,当然我个人认为yum软件与MacOS下的Homebrew相比还差点儿(也许是因为研究得不够深入?),不过先把必要的包安装好吧。

yum -y install pcre-devel openssl-devel lrzsz openssh-clients gcc libffi-devel

3-1. pip配置

默认的pip是python2的,因此我们需要先卸载python2的pip,然后再下载python3的pip。

python -m pip uninstall pip	#用python(python2)卸载pip
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py 
sudo python3 get-pip.py	#用python3下载pip并运行,这样pip就关联到这个python版本了

image-20210316123912168

注意到警告,环境变量PATH中没有这个目录,因此当前输入的pip命令无法找到对应的pip软件路径。这样修改就可以了:

export PATH=/usr/local/python3Dir/bin:$PATH

修改后,安装必要的python库(因为是阿里云的服务器,所以不需要更改源了)

pip install selenium==2.48.0 numpy pandas opencv-python pytesseract Image backports.lzma

安装完pytesseract后,会出现问题【Python tesseract is not installed or it’s not in your path】,需要修改一下内部的文件。注意到安装路径为下图所示:

image-20210316131942894

cd /usr/local/python3Dir/lib/python3.8/site-packages/pytesseract
vim pytesseract.py

image-20210316132348121

修改第32行。

使用【which】命令,查找pytesseract命令是否已经安装到bin下了:

image-20210316132657367

返回安装路径,然后将tesseract_cmd改为此路径即可。

image-20210316132730973

关于PYTHONPATH变量缺失的问题:在/etc/profile中,补上最后一行:image-20210316194829603

这个pythonpath的路径是pip的下载第三方包路径,pip下载第三方包后,存储在【pip –version】的返回路径下,对应图中的路径是【/usr/local/python3Dir/lib/python3.8/site-packages】,更改后,我们可以看到,sys.path中有了刚才添加的路径。

image-20210316135530941

image-20210316192014349

3-2. _bz2配置

关于_bz2缺失的问题,首先在网上下载【_bz2.cpython-38-x86_64-linux-gnu.so】文件,然后sftp传到服务器上,执行以下操作:

mv _bz2.cpython-38-x86_64-linux-gnu.so /usr/local/lib/python3.8/lib-dynload
cd /usr/local/lib/python3.8/lib-dynload
chmod +x _bz2.cpython-38-x86_64-linux-gnu.so

3-3. pandas配置

此前pip下载【backports.lzma】是为了解决pandas的import报警,解决方案如下:

首先根据pip绑定的路径,打开python3.8的目录:

cd /usr/local/python3Dir/lib/python3.8
vi lzma.py

将下图被注释的代码片段改为:

image-20210316213219448

3-4. phantomjs配置

首先从网络上下载【phantomjs-2.1.1-linux-x86_64.tar.bz2】,然后传到云服务器上。

tar -xvf phantomjs-2.1.1-linux-x86_64.tar.bz2
cd phantomjs-2.1.1-linux-x86_64 
yum install fontconfig freetype2

然后需要修改/etc/profile,在里面添加上phantomjs的bin文件路径,否则无法通过输入【phantomjs】命令启动软件(与前文同理)

vi /etc/profile

在79行添上相应内容(我的phantomjs是放在~(个人用户根目录)下的,所以这样设置)

image-20210316231327337

安装leptonica库:

wget http://www.leptonica.org/source/leptonica-1.80.0.tar.gz
tar -xvf leptonica-1.80.0.tar.gz
cd leptonica-1.80.0
./configure
make && make install

然后在/etc/profile最后补上这三行,并【source /etc/profile】使之生效。

image-20210317154858274

安装tesseract-ocr:

wget https://codeload.github.com/tesseract-ocr/tesseract/tar.gz/4.1.0#这一步骤也可以替换成通过在本机上下载然后sftp到云上
tar -xvf 4.1.0
cd tesseract-4.1.0/
./autogen.sh
yum install gcc gcc-c++ gcc-g77#安装依赖库
./configure
make && make install
sudo ldconfig

这样就安装了tesseract的bin文件。在pip下载的pytesseract安装包中,打开py文件,修改tesseract_cmd:

image-20210317162243282

解决上述问题后,出现错误如下图所示:

image-20210317162204858

说明没安装语言包。在csdn上下载必要的语言包:

image-20210317162918935

将这三个sftp到云上新建的~/tessdata文件夹下,然后输入:

mv tessdata/* /usr/local/share/tessdata/

完成。

4. crontab配置

5. 服务器下载谷歌网盘文件

背景:跑项目有时候需要存储于google drive的文件(checkpoint, dump等),而在本地下载后上传到服务器流程繁琐,且消耗太多VPN流量。我们希望能在linux主机上稳定下载谷歌网盘文件。

首先我们需要找到google drive文件的ID,它是一串hash code,在网页上打开一个网盘文件即可在URL中找到它的ID,例如

https://drive.google.com/file/d/1mekls6OGOKLmt7gYtHs0WGf5oTamTNat/view

然后下载gdown:

pip install gdown

用gdown命令和文件FILEID即可下载文件:

gdown 'https://drive.google.com/uc?id=<FILEID>'

此类方法适合下载小文件。当文件比较大时,可能会报如下错误:

Too many users have viewed or downloaded this file recently. Please try accessing the file again later. If the file you are trying to access is particularly large or is shared with many people, it may take up to 24 hours to be able to view or download the file. If you still can’t access a file after 24 hours, contact your domain administrator.

此时需要用google API开发者模式才能解决这个问题。 首先进入开发者界面:

https://developers.google.com/oauthplayground/

左侧有一个文本框【Step 1 select & authorize APIs】粘贴【https://www.googleapis.com/auth/drive.readonly】,点击Authorize APIs

下一步,复制【Step 2 Exchange authorization code for tokens】下的【Authorization code】

最后,在终端中输入以下命令即可开始下载大文件。

curl -H "Authorization: Bearer <AUTHORIZATION_CODE>" https://www.googleapis.com/drive/v3/files/<FILEID>?alt=media -o <OUTPUTFN>.zip

可能遇到的问题:在服务器上下载需要梯子,但是这种下载方式消耗流量远远高于谷歌网盘文件大小。暂不知道原因为何。