Linux一些常用命令
解压缩命令
-
.tar
#解包:(注:tar是打包,不是压缩!) tar xvf FileName.tar #打包: tar cvf FileName.tar DirName
-
.gz
# 解压: gunzip FileName.gz gzip -d FileName.gz # 压缩: gzip FileName
-
.tar.gz 和 .tgz
# 解压: tar zxvf FileName.tar.gz # 压缩: tar zcvf FileName.tar.gz DirName
-
.bz2
# 解压: bzip2 -d FileName.bz2 bunzip2 FileName.bz2 # 压缩: bzip2 -z FileName
-
.tar.bz2
# 解压: tar jxvf FileName.tar.bz2 或tar –bzip xvf FileName.tar.bz2 # 压缩: tar jcvf FileName.tar.bz2 DirName
-
.bz
# 解压: bzip2 -d FileName.bz bunzip2 FileName.bz # 压缩:未知
-
.tar.bz
# 解压: tar jxvf FileName.tar.bz # 压缩:未知
-
.Z
# 解压: uncompress FileName.Z # 压缩: compress FileName
-
.tar.Z
# 解压: tar Zxvf FileName.tar.Z # 压缩: tar Zcvf FileName.tar.Z DirName
-
.zip
# 解压: unzip FileName.zip # 压缩: zip FileName.zip DirName # 压缩一个目录使用 -r 参数,-r 递归。例: zip -r FileName.zip DirName
关掉一些不必要的服务
-
一般端口
chkconfig --list | grep "3:开" | egrep -v "sshd|network|rsyslog|sysstat|crond" | awk '{print "chkconfig",$1,"off"}' chkconfig --list | grep "3:开" | egrep -v "sshd|network|rsyslog|sysstat|crond" | awk '{print "chkconfig",$1,"off"}' | bash # 关闭25端口 sudo systemctl stop postfix sudo systemctl disable postfix # 关闭631端口(未彻底关闭,过段时间又会启动) sudo systemctl stop cups sudo systemctl disable cups # 111 sudo systemctl stop rpcbind.socket sudo systemctl stop rpcbind sudo systemctl disable rpcbind.socket sudo systemctl disable rpcbind # 5353/udp avahi-daemon sudo systemctl stop avahi-daemon.socket; sudo systemctl stop avahi-daemon.service sudo systemctl disable avahi-daemon.socket sudo systemctl disable avahi-daemon.service # 6000端口,进程是X,可能是图形界面,网上查是这么关的,但是关闭失败 # sudo sed -i 's/^serverargs\=\"\"/serverargs\=\"-nolisten tcp\"/' /usr/bin/startx # 禁用IPv6 sudo sed -i -e '/net.ipv6.conf.all.disable_ipv6/d' /etc/sysctl.conf sudo sh -c "echo 'net.ipv6.conf.all.disable_ipv6 = 1' >> /etc/sysctl.conf" sudo sed -i 's/^\(GRUB_CMDLINE_LINUX\=\"\)\(crashkernel=auto\)/\1ipv6.disable\=1 \2/' /etc/default/grub sudo grub2-mkconfig -o /boot/grub2/grub.cfg # 恢复IPv6 sudo sed -ri 's/^net.ipv6.conf.all.disable_ipv6.*/#&/' /etc/sysctl.conf sudo sed -i 's/^\(GRUB_CMDLINE_LINUX=\"\)ipv6.disable=1\( *crashkernel=auto.*\)/\1\2/' /etc/default/grub sudo grub2-mkconfig -o /boot/grub2/grub.cfg
-
关于192.168.122.1:53
在我们使用虚拟机管理器的图形界面来安装虚拟机的时候,自动创建虚拟网桥和虚拟网卡。但是我们很少会在一个虚拟机中再安装一个虚拟机,所以,我们可以将该网桥删除。
使用ifconfig
查看发现,有3个网卡:ens33、lo和virbr0,把virbr0干掉即可:# 安装libvirt,不然会提示找不到virsh命令 sudo yum -y install libvirt sudo virsh net-list sudo virsh net-destroy default sudo virsh net-undefine default sudo systemctl restart libvirtd sudo yum -y remove libvirt
ssh远程执行命令
执行简单命令
ssh ccc@192.168.5.51 "ls"
执行交互命令,需要-t选项
ssh -t ccc@192.168.5.51 "sudo ls"
执行多个命令,用封号隔开
ssh ccc@192.168.5.51 "ls; pwd"
执行多个命令,多行输入,一行一个命令,用单引号或双引号,如果命令有双引号,外面就用单引号
ssh ccc@192.168.5.51 "
ls
pwd
/opt/test.sh haha
"
# 或者这样,remotessh可以随便改成别的,两个一样就行,第二个必须顶头,前面不能有缩进
ssh -tt ccc@192.168.5.51 << remotessh
cd /opt
pwd
ls /opt
/opt/test.sh haha
exit
remotessh
引用变量,需要-c选项
TMP=Hello
ssh ccc@192.168.5.51 bash -c "'
echo $TMP
'"
unset TMP
远程执行脚本
执行本地的脚本,-s
echo -e "ls\npwd\necho \$1" > test.sh
chmod +x test.sh
ssh ccc@192.168.5.51 'bash -s' < test.sh haha
执行对方的脚本
# 如果需要用到/etc/profile里面的路径设置,命令必须增加source /etc/profile;
# 如: ssh ccc@192.168.5.51 "source /etc/profile;java -version"
ssh ccc@192.168.5.51 "/opt/test.sh haha"
# 对方的/opt/test.sh里面没有sudo,否则需要使用-t,并手动输入口令
ssh -t ccc@192.168.5.51 "/opt/test.sh haha"
执行对方的脚本,带交互
#!/usr/bin/expect -f
# 执行ssh服务器上的命令或脚本,必须有类似sudo这种需要用户交互的才用次脚本,否则直接运行,没必要用次脚本
# 需要4个参数:ip、usr、pwd、cmd,其中cmd即远程机器中的脚本,绝对路径,允许带参数
# 例: TMP=hahaha;./test1.sh 192.168.5.51 user01 123456 "/opt/test.sh ${TMP}"
set timeout 5
set ip [lindex $argv 0]
set usr [lindex $argv 1]
set pwd [lindex $argv 2]
set cmd [lindex $argv 3]
spawn ssh -t ${usr}@${ip} ${cmd}
expect {
"(yes/no)?" {
send "yes\n"
expect "password:"
send "${pwd}\n"
}
"password:" {
send "${pwd}\r"
}
"密码:" {
send "${pwd}\r"
}
}
expect eof
# interact表示保持交互
# interact
关闭SELinux
查看
getenforce
关闭
# 临时关闭
setenforce 0
# 永久关闭
vi /etc/selinux/config
# 将SELINUX=enforcing 改为 SELINUX=disabled
字符串操作(长度,读取,替换)
表达式 | 含义 |
---|---|
${#string} | $string的长度 |
${string:position} | 在 s t r i n g 中 , 从 位 置 string中, 从位置 string中,从位置position开始提取子串 |
${string:position:length} | 在 s t r i n g 中 , 从 位 置 string中, 从位置 string中,从位置position开始提取长度为$length的子串 |
${string#substring} | 从变量 s t r i n g 的 开 头 , 删 除 最 短 匹 配 string的开头, 删除最短匹配 string的开头,删除最短匹配substring的子串 |
${string##substring} | 从变量 s t r i n g 的 开 头 , 删 除 最 长 匹 配 string的开头, 删除最长匹配 string的开头,删除最长匹配substring的子串 |
${string%substring} | 从变量 s t r i n g 的 结 尾 , 删 除 最 短 匹 配 string的结尾, 删除最短匹配 string的结尾,删除最短匹配substring的子串 |
${string%%substring} | 从变量 s t r i n g 的 结 尾 , 删 除 最 长 匹 配 string的结尾, 删除最长匹配 string的结尾,删除最长匹配substring的子串 |
${string/substring/replacement} | 使用 r e p l a c e m e n t , 来 代 替 第 一 个 匹 配 的 replacement, 来代替第一个匹配的 replacement,来代替第一个匹配的substring |
${string//substring/replacement} | 使用 r e p l a c e m e n t , 代 替 所 有 匹 配 的 replacement, 代替所有匹配的 replacement,代替所有匹配的substring |
${string/#substring/replacement} | 如果 s t r i n g 的 前 缀 匹 配 string的前缀匹配 string的前缀匹配substring, 那么就用 r e p l a c e m e n t 来 代 替 匹 配 到 的 ∥ replacement来代替匹配到的\| replacement来代替匹配到的∥substring |
${string/%substring/replacement} | s t r i n g 的 后 缀 匹 配 string的后缀匹配 string的后缀匹配substring, 那么就用 r e p l a c e m e n t 来 代 替 匹 配 到 的 replacement来代替匹配到的 replacement来代替匹配到的substring |
变量默认值
表达式 | 含义 |
---|---|
${vari:-defaultValue} | 当var没有定义时,此时使用defaultValue, 而vari依然为空,没有改变值 |
${vari:=defaultValue} | 当vari没有定义时,此时使用defaultValue, 同时vari也被赋值为defaultValue |
${vari:+value} | 当vari定义并且不为空,将用value替换vari的值,否则什么也不做, 与${vari:-value}相反 |
${vari:?value} | 当vari没有定义时,或者定义了值为空,将在终端报错并且退出,用于检查是否定义以及是否为空 |
文件比较符
表达式 | 含义 |
---|---|
-e | 判断对象是否存在 |
-d | 判断对象是否存在,并且为目录 |
-f | 判断对象是否存在,并且为常规文件 |
-L | 判断对象是否存在,并且为符号链接 |
-h | 判断对象是否存在,并且为软链接 |
-s | 判断对象是否存在,并且长度不为0 |
-r | 判断对象是否存在,并且可读 |
-w | 判断对象是否存在,并且可写 |
-x | 判断对象是否存在,并且可执行 |
-O | 判断对象是否存在,并且属于当前用户 |
-G | 判断对象是否存在,并且属于当前用户组 |
-nt | 判断file1是否比file2新 [ “/data/file1” -nt “/data/file2” ] |
-ot | 判断file1是否比file2旧 [ “/data/file1” -ot “/data/file2” ] |
逻辑运算符
表达式 | 含义 | - |
---|---|---|
= | 等于 | 应用于:整型或字符串比较 如果在[] 中,只能是字符串 |
!= | 不等于 | 应用于:整型或字符串比较 如果在[] 中,只能是字符串 |
< | 小于 | 应用于:整型比较 在[] 中,不能使用 表示字符串 |
> | 大于 | 应用于:整型比较 在[] 中,不能使用 表示字符串 |
-eq | 等于 | 应用于:整型比较 |
-ne | 不等于 | 应用于:整型比较 |
-lt | 小于 | 应用于:整型比较 |
-gt | 大于 | 应用于:整型比较 |
-le | 小于或等于 | 应用于:整型比较 |
-ge | 大于或等于 | 应用于:整型比较 |
-a | 双方都成立(and) | 逻辑表达式 –a 逻辑表达式 |
-o | 单方成立(or) | 逻辑表达式 –o 逻辑表达式 |
-z | 空字符串 | |
-n | 非空字符串 |
set命令
-a | 标示已修改的变量,以供输出至环境变量。 |
-b | 使被中止的后台程序立刻回报执行状态。 |
-C | 转向所产生的文件无法覆盖已存在的文件。 |
-d | Shell预设会用杂凑表记忆使用过的指令,以加速指令的执行。使用-d参数可取消。 |
-e | 若指令传回值不等于0,则立即退出shell。 |
-f | 取消使用通配符。 |
-h | 自动记录函数的所在位置。 |
-H | Shell:可利用"!"加<指令编号>的方式来执行history中记录的指令。 |
-k | 指令所给的参数都会被视为此指令的环境变量。 |
-l | 记录for循环的变量名称。 |
-m | 使用监视模式。 |
-n | 只读取指令,而不实际执行。 |
-p | 启动优先顺序模式。 |
-P | 启动-P参数后,执行指令时,会以实际的文件或目录来取代符号连接。 |
-t | 执行完随后的指令,即退出shell。 |
-u | 当执行时使用到未定义过的变量,则显示错误信息。 |
-v | 显示shell所读取的输入值。 |
-x | 执行指令后,会先显示该指令及所下的参数。 |
查看进程的环境变量
当Fabric网络的状态数据库使用CouchDB时,如何保护CouchDB口令是一个问题。
查看进程号
pgrep peer
# 或者通过查看端口,也可以看到进程号,如
sudo netstat -ntlp
查看环境变量
cat /proc/14191/environ | tr '\0' '\n'
# cat /proc/14191/environ | tr '\0' '\n' | grep COUCHDB
openssl
ans1parse
openssl asn1parse -in ca.key
openssl x509 -text -noout -in server.pem
echo MEYCIQC1obiO2+lwn9hZBGvwyGADC9xmNZhes//MiTWDcxvxWAIhAMBWItE5NDQ0vP4NIdn75DtDPL//BGfbKZKERBQXEvFc | gmssl base64 -d -out sign.data
查看用户
- 用户列表文件:/etc/passwd/
- 用户组列表文件:/etc/group
- 查看系统中有哪些用户:
$ cut -d : -f 1 /etc/passwd
- 查看可以登录系统的用户
$ cat /etc/passwd | grep -v /sbin/nologin | cut -d : -f 1
- 查看系统中有哪些用户组
$ cut -d : -f 1 /etc/group
- 查看可以登录系统的用户组
$ cat /etc/group | grep -v /sbin/nologin | cut -d : -f 1
- 查看用户操作:w命令(需要root权限)
- 查看某一用户:w 用户名
- 查看登录用户:who
- 查看用户登录历史记录:last
- 修改root用户密码:passwd
- root用户修改其他用户密码:
passwd <user_name>
关于"Too many open files"
# 查看某进程的限制:
cat /proc/81824/limits
cat /proc/`lsof -ti:5984`/limits
# vim /etc/security/limits.conf 和 /etc/security/limits.d/20-nproc.conf
# 新建一个独立文件/etc/security/limits.d/nofilelimit.conf,重启生效(ssh连接无需重启,直接生效)
sudo sh -c "echo -e '* soft nofile 65535\n* hard nofile 65535' > /etc/security/limits.d/nofilelimit.conf"
# ssh远程执行脚本
ssh -t ccc@192.168.8.154 "sudo sh -c 'echo -e \"* soft nofile 65535\n* hard nofile 65535\" > /etc/security/limits.d/nofilelimit.conf'"
# ulimit -a
# 要让上述设置在ssh中生效,需在/etc/ssh/sshd_config文件中设置:
UsePAM Yes