记录 Linux 下遇到的问题、技巧与备忘。
令 Tab 补全对忽略大小写
所有用户:/etc/inputrc
当前用户:~/.inputrc
输入内容:set completion-ignore-case on
history
不显示连续、重复、特定的命令、加上时间戳
于/etc/bashrc
(或~/.bashrc
)中添加将1
2
3HISTTIMEFORMAT='%F %T '
HISTCONTROL=erasedups
HISTIGNORE="ls:pwd:cd:clear:vim:fg:bg:jobs:top"HISTCONTROL
设成ignoredups
仅忽略连续的重复命令,而erasedups
清除整个历史中重复条目常用终端快捷键
快捷键 用途 快捷键 用途 Ctrl-A
移动到行首 Esc-F
移动到后面一个单词 Ctrl-E
移动到行末 Ctrl-K
删除到行末 Ctrl-B
移动到前面一个字母 Ctrl-U
删除到行首 Ctrl-F
移动到后面一个字母 Ctrl-T
交换光标位置前两个字符 Esc-B
移动到前面一个单词 Esc-T
交换光标位置前两个单词 SSH 登录服务器缓慢解决方案:
- 关闭 DNS 反向解析:
vim /etc/ssh/sshd_config
,设定其中UseDNS=no
,重启服务service sshd restart
- 服务端禁用
GSSAPIAuthentication
:同样在/etc/ssh/sshd_config
中设定GSSAPIAuthentication no
- 关闭 DNS 反向解析:
SSH 登录欢迎界面设置文件:
/etc/motd
SSH Log 日志文件:
- Redhat,Fedora Core:
/var/log/secure
- Mandrake,FreeBSD,OpenBSD,Debian:
/var/log/auth.log
- SUSE:
/var/log/messages
- Redhat,Fedora Core:
系统内建函数
time
功能有限 (real
时间是指挂钟时间,也就是命令开始执行到结束的时间。这个短时间包括其他进程所占用的时间片, 和进程被阻塞时所花费的时间。user
时间是指进程花费在用户模式中的CPU时间, 这是唯一真正用于执行进程所花费的时间,其他进程和花费阻塞状态中的时间没有计算在内。sys
时间是指花费在内核模式中的 CPU 时间,代表在内核中执系统调用所花费的时间,这也是真正由进程使用的 CPU 时间)
REHL 与 Debian 中的man time
是不同的。比如输出带管道命令的运行时间:\time -f '%es' bash -c './test.py | sort > /dev/null'
,其中time
前面的\
消除alias
对命令的影响(相当于执行/usr/bin/time
),在这里由于time
是内建命令(与/usr/bin/time
冲突)screen
玩法:-ls
– 列出当前用户分享的 screen-dmS session
– 新建一个 session(-d
表示不立即附着)-r
– (对于本机登录的自己)恢复离线的 screen 作业-x
– (对于别处登录的相同的账号)恢复作业,实现同账号分享
以下操作处于
screen
中:<C-a> d
– 从screen
中脱离(注:直接<C-d>
会关闭这个screen
!)<C-a> s
– 冻结屏幕<C-a> q
– 恢复冻结的屏幕<C-a> :multiuser on
– 开始多用户模式<C-a> :acladd USER
– 多用户模式中允许用户USER
访问
要实现不同账号分享,首先在
root
权限下执行:再开启多用户模式,添加用户访问权限,其它用户通过命令1
2
3chmod u+s $(which screen)
chmod 755 /var/run/screen
rm -fr /var/run/screen/*screen -x usera/shared
即可。
另,出现cannot open terminal
时可用script /dev/null
Zsh 中的
nohup
与 Bash 有所不同:关闭 shell 后仍然会停止后台任务。 解决方案:nohup <command> & disown
<command> &!
setopt NO_HUP
获得指定用户登录 Shell 路径:
getent passwd $LOGNAME | cut -d: -f7
配置静态 DNS (Ubuntu):修改
/etc/network/interfaces
:重启1
dns-nameservers 223.5.5.5 223.6.6.6
networking
:sudo /etc/init.d/networking restart
docker 命令免
sudo
:1
2
3sudo groupadd docker
sudo gpasswd -a ${USER} docker
sudo service docker restart命令
lsb_release
提示No LSB modules are available.
:1
sudo apt install lsb-core
开启 swap (交换)分区:
- 创建用于交换分区的文件 注:
1
dd if=/dev/zero of=/mnt/swap bs=block_size count=number_of_block
block_size
,number_of_block
大小可以自定义,比如bs=1M
,count=1024
,代表设置 1G 大小 swap 分区 - 设置交换分区文件
1
mkswap /mnt/swap
- 立即启用交换分区文件 如果在
/etc/fstab 1
swapon /mnt/swap
/etc/rc.local
中有swapoff -a
需要修改为swapon -a
- 设置开机时启用
swap
分区:注:1
/mnt/swap swap swap defaults 0 0
/mnt/swap
路径可以修改,可以根据创建的swap
文件具体路径来配置,设置后可以执行free -m
命令查看效果。
参考:针对阿里云及腾讯云等默认不开启swap分区解决办法
- 创建用于交换分区的文件
利用
svn
从远程仓库下载部分目录:- GitHub:
svn export https://github.com/<username>/<repo>/trunk/<subdir>
- 码云:
svn export svn://git.oschina.net/<username>/<repo>/trunk/<subdir>
- 码市:
svn export svn+ssh://svn@svn.coding.net/<username>/<repo>/trunk/<subdir>
其中 GitHub 已默认开启 svn; 码云及码市需要手动开启。如要获取额外的版本信息,将
export
改为checkout
- GitHub:
CentOS7.3 (REHL 7) 为 GDB 工具安装必要包
debuginfo
。
对简单的一段程序进行调试,却提示缺少包,需要通过debuginfo-install
去安装glibc-2.17-...
,但无法直接安装debuginfo-install
,发现此工具在yum-utils
中,所以首先安装yum-utils
然后需要在1
yum install yum-utils
/etc/yum/repos.d
下新建CentOS-Debuginfo.repo
文件:保存即可/etc/yum/repos.d/CentOS-Debuginfo.repo 1
2
3
4
5
6#Debug Info
[debuginfo]
name=CentOS-$releasever - DebugInfo
baseurl=http://debuginfo.centos.org/$releasever/$basearch
gpgcheck=0
enabled=1U 盘安装 CentOS 7.3
- Windows 下用 UltraISO 将系统刻入 U 盘
- 改 BIOS 启动引导项为 U 盘,进入的第一个界面中将光标移至
Install ...
,按下Tab
,修改命令为1
vmlinuz initrd=initrd.img linux dd quiet
- 上面的命令只是查询 U 盘的设备号,比如此次安装时显示出 U 盘的设备号为
sdb4
,按下Ctrl-Alt-Del
强制重启,在下次的重启选项中键入1
vmlinuz initrd=initrd.img inst.stage2=hd:/dev/sdb4 quiet
源码编译
Git
:注:Git 源文件中的 Makefile 默认不提供1
2
3
4
5
6wget 'https://github.com/git/git/archive/v2.17.0-rc0.tar.gz'
tar -xzvf v2.17.0-rc0.tar.gz
cd git-2.17.0-rc0
make configure
./configure --prefix=/usr/local/git-2.17
sudo make install -j4uninstall
选项, 安装时务必慎重选取安装路径。
参考: How To Install Git on CentOS 7Ubuntu 报错
sudo: unable to resolve host
:其中第三列为主机名/etc/hosts 1
127.0.0.1 localhost abcdefg
安装 Node.js 后报错:
/usr/bin/env: ‘node’: No such file or directory
解决方案:1
ln -s /usr/bin/nodejs /usr/bin/node
SSH 登录出现错误提示
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
,一般是因为认证密钥过期,解决方案:- 根据提示删除
~/.ssh/known_hosts
中相应的行 ssh-keygen -R "you server hostname or ip"
- 根据提示删除
HEREDOC 作为参数调用方法(以
perl -e
为例):其中,为避免叹号1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16echo -e "\n"; set +H; perl -E "$(cat <<'EOP'
foreach (1..10) {
our $num = $_;
say "Iteration number $_.\n";
print "Please choose: last, next, redo, or none of the above? ";
chomp(my $choice = <STDIN>);
say;
last if $choice =~ m'last'i;
next if $choice =~ m`next`i;
redo if $choice =~ /redo/i;
say "That wasn't any of the choices ... onward!\n";
}
say "That's all folks!";
say "And the last number is $num";
EOP
)"; set -H!
(Exclamation Mark)引用历史命令使用set +H
yum 安装包时不清楚程序所在程序包名如何查询:
yum provides */<program>
从暂停中的虚拟机恢复后,无法连接 docker 中的容器(数据库、网页应用等):以 Rocky Linux 8.7 为例,在文件
/etc/NetworkManager/conf.d/10-unmanage-docker-interfaces.conf
中键入:参考:Can’t connect to docker after resuming VM1
2[keyfile]
unmanaged-devices=interface-name:docker*;interface-name:veth*;interface-name:br-*;interface-name:vmnet*;interface-name:vboxnet*