常用命令
每个账号都可以有多个用户组的支持
chgrp: 改变文件所属用户组
chown:改变文件所有者
chmod:改变文件的权限
umask:取消什么权限
diff: 比较文件之间的区别
file :查看文件类型
which:寻找执行文件 如 which ls
whereis locate:查找文件,前者精确 后者部分,都从数据库查找,效率高
updatedb:更新上面两个命令所使用的数据库,cent OS默认一天更新一次
**find: **查找文件,较复杂,从磁盘找,较慢
**wc: ** 统计
-l:仅列出多少行
-w:仅列出多少字(英文单词)
-m:多少字符
ls:
-a 列出所有文件,包括隐藏文件
-d 仅列出目录本身
-S 以文件容量大小进行排序
cp:
-i:覆盖前询问
-a:复制出和原文件一模一样的文件, 包括建立时间等
-p:连同文件的属性一起复制过去,而非使用默认属性,(备份常用)
-r:递归持续复制,用于目录的复制
-s:复制成为符号链接文件, 即快捷方式文件
-f:强制
-u:在目标文件和源文件有差异时才会复制,(备份常用)
查看linux系统主机信息:
- 查看逻辑CPU的个数
cat /proc/cpuinfo | grep "processor" | wc -l
- 查看内存信息
cat /proc/meminfo
vim:
R:使用recover选项
:set nu 显示行号
:dd 删除光标所在的整行
:yy 复制光标所在的一行
:gg 移动到文件的第一行
:G 移动到这个文件的最后一行
:p表示将一复制的数据粘贴在光标的下一行, :P表示粘贴在上一行
:[ctrl] + v 块选择
:n编辑上一个文件 :N表示编辑下一个文件
:sp 在新窗口打开同一份文件 :sp + 文件名 打开另一个文件
cat:
-n:打印行号
head tail:
- -n 100 // 打印前(后)多少行
压缩、解压缩:
解:tar -zxvf *.tar.gz *
压:tar -zcvf ...
排除目录: tar -zcvf tomcat.tar.gz --exclude=tomcat/logs tomcat
远程 传输文件----scp
示例:
1. 从远程复制目录到本地目录。
说明:从192.168.120.204机器上的/opt/soft/中下载mongodb 目录到本地的/opt/soft/目录来。
$scp -r [email protected]:/opt/soft/mongodb /opt/soft/
2. 上传本地文件到远程目录。
说明:复制本地opt/soft/目录下的文件nginx-0.5.38.tar.gz 到远程机器192.168.120.204的opt/soft/scptest目录
$scp /opt/soft/nginx-0.5.38.tar.gz [email protected]:/opt/soft/scptesiiiit
注:scp配置免密登录
若A想要ssh免密登录B:
1.先在两台主机对应用户目录生成.ssh文件
ssh-keygen
2.在B对应用户目录下的.ssh文件中生成authorized_key文件
vim authorized_key
3.将A主机对应用户目录的.ssh目录下的id_rsa.pub文件的内容复制到B主机刚生成的authorized_key文件内
bash 环境变量
参考
Linux 中/etc/profile、~/.bash_profile 环境变量配置及执行过程
linux ssh自动登录,自动交互 expect
参考
linux expect详解(ssh自动登录)
shell编程
一行执行多条命令可以分号(;)隔开, 命令会依序执行
test 命令:
Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
数值测试
-eq 等于则为真
-ne 不等于则为真
-gt 大于则为真
-ge 大于等于则为真
-lt 小于则为真
-le 小于等于则为真
实例演示:
num1=100
num2=100
if test $[num1] -eq $[num2]
then
echo '两个数相等!'
else
echo '两个数不相等!'
fi
输出结果:
两个数相等!
字符串测试
= 等于则为真
!= 不相等则为真
-z 字符串 字符串的长度为零则为真
-n 字符串 字符串的长度不为零则为真
实例演示:
num1="ru1noob"
num2="runoob"
if test $num1 = $num2
then
echo '两个字符串相等!'
else
echo '两个字符串不相等!'
fi
输出结果:
两个字符串不相等!
文件测试
-e 文件名 如果文件存在则为真
-r 文件名 如果文件存在且可读则为真
-w 文件名 如果文件存在且可写则为真
-x 文件名 如果文件存在且可执行则为真
-s 文件名 如果文件存在且至少有一个字符则为真
-d 文件名 如果文件存在且为目录则为真
-f 文件名 如果文件存在且为普通文件则为真
-c 文件名 如果文件存在且为字符型特殊文件则为真
-b 文件名 如果文件存在且为块特殊文件则为真
实例演示:
cd /bin
if test -e ./bash
then
echo '文件已存在!'
else
echo '文件不存在!'
fi
输出结果:
文件已存在!
&和&&,|和||:
- & 表示任务在后台执行,如要在后台运行redis-server,则有
redis-server &
- && 表示前一条命令执行成功时,才执行后一条命令 ,如
echo 'hello‘ && echo 'world'
- | 表示管道,上一条命令的输出,作为下一条命令参数,如
echo 'hello' | wc -l
- || 表示上一条命令执行失败后,才执行下一条命令,如
cat nofile || echo "failed"
cut grep
cut: 将一段信息的某一段切出来,处理信息以行为单位 示例如下:
cut -d ':' -f 3,5
A:B:C:D:E:F
以“:”为分隔符,列出第三个和第五个C和E
grep: 可以解析一个文件中的一行文字,取得关键字,就会整行列出来
grep [-acinv] "查找的字符串" filename
-a:将binary文件已text文件的方式查找数据
-c:计算找到 “查找字符串” 的次数
-i:忽略大小写的不同
-n:顺便输出行号
-v:反向选择,即显示出没有 “查找字符串” 内容的哪一行
printf命令
printf format-string [arguments...]
%s %c %d %f都是格式替代符
%-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
%-4.2f 指格式化为小数,其中.2指保留2位小数。
#!/bin/bash
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876
执行脚本,输出结果如下所示:
姓名 性别 体重kg
郭靖 男 66.12
杨过 男 48.65
郭芙 女 47.99
sh脚本执行其他sh文件的三种方式:
第一种
♦fork 是最普通的, 就是直接在脚本里面用 path/to/foo.sh 来调用
foo.sh 这个脚本,比如如果是 foo.sh 在当前目录下,就是 ./foo.sh。运行的时候 terminal 会新开一个子 Shell 执行脚本 foo.sh,子 Shell 执行的时候, 父 Shell 还在。子 Shell 执行完毕后返回父 Shell。 子 Shell 从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回父 Shell。
第二种
♦exec 特点:exec调用一次之后的所有代码都不执行
exec 与 fork 不同,不需要新开一个子 Shell 来执行被调用的脚本. 被调用的脚本与父脚本在同一个 Shell 内执行。但是使用 exec 调用一个新脚本以后, 父脚本中 exec 行之后的内容就不会再执行了。这是 exec 和 source 的区别.
第三种
♦sourcesource特点不会生成子PID也就是子进程,他就行把被用的脚本拷贝到当前shell脚本中执行,可以重复被调用。
与 fork 的区别是不新开一个子 Shell 来执行被调用的脚本,而是在同一个 Shell 中执行. 所以被调用的脚本中声明的变量和环境变量, 都可以在主脚本中进行获取和使用。
踩坑
1. 升级Python版本 - 升级后会遇到pip的问题,如下
'Traceback (most recent call last):
File "/usr/bin/pip", line 9, in
from pip import main
ImportError: No module named 'pip' ''
用该方法解决pip 重新安装
2. unary operator expected 报错
运行报错 :
line 5: [: -ge: unary operator expected
错误原因:
由于变量rate初始化赋值为空,那么就成了 [ -ge "10"] 了,显然和 "10" 不相比较并且缺少了 符号,所以报了这样的错误。
shell判断条件时变量不若没有初始化就会为空,就会报错
解决办法:多套一个中括号
3. `` '' "" $() linux命令中单引号 双引号 反引号的区别
-
单引号''和双引号"" 反引号`` 的区别
(1)单引号' '
单引号将其中的内容都作为了字符串来,忽略所有的命令和特殊字符,类似于一个字符串的用法>echo 'This is a string' >This is a string >echo 'ls ./' >ls ./
(2)双引号" "
双引号与单引号的区别在于其可以包含特殊字符(单引号直接输出内部字符串,不解析特殊字符;双引号内则会解析特殊字符),包括 (', ", $, , ) 如果要忽略特殊字符,就可以利用\来转义,忽略特殊字符,作为普通字符输出:
var = 1
echo '$var'
>$var
echo "$var"
> 1
echo "Here 'this is a string' is a string"
>Here 'this is a string' is a string
echo "Here \"this is a string\" is a string"
>Here "this is a string" is a string
(3)反引号``
反引号用来包含一个命令字符串的,其中的命令会先执行,得到的结果会返回到层命令再执行:
echo `echo 'this is the inner string'`+'out'
> this is the inner string+out
echo `echo 'this is the inner \` string'`+'out' #转义反引号
> this is the inner ` string+out
反引号类似与$(command)类似。
-
把命令输出结果赋给变量两种方式
(1)last_msg=
cut -d '+' -f 2 ./msg
(2)last_msg=$(cut -d '+' -f 2 ./msg)以上两种方式都是直接把输出的内容付给变量并不是带引号的字符串形式,所以后续在使用的时候就有问题,
比如 grep 命令的pattern 是带双引号的"" 才可以匹陪 所以需要给这样的变量加上字符串 可以这样"${last_msg}"
就相当于给变量加上字符串啦
- 解决SSH自动断线,无响应的问题。
描述这样一种情况:
两台linux主机 A和B,在A上执行这样一条命令
ssh [email protected] sh /home/tyx/slave_build.sh
此处ip为B的,编造,忽略,tyx是B主机上的用户,由于该脚本需执行较长时间,所以ssh连接总被自动断掉。导致脚本执行失败,报错如下
最后翻阅众多博客,文章无果,搜索报错无果,最后仔细分析原因搞清ssh断的原因找出了解决办法,配置/etc/ssh/sshd_config 和 /etc/ssh/sshd_config 文件
TCPKeepAlive yes
ClientAliveInterval 360 #每6分钟(360秒)向client端发个包
ClientAliveCountMax 20 #最多发20次,这样可以保持2小时(7200秒)的连接
最后重启一下ssh服务:
service sshd restart
注:
- 第一个参数表示要保持TCP连接
- ClientAliveInterval是设定SSH强制超时断开的参数ClientAliveInterval指定了服务器端向客户端请求消息的时间间隔, 默认是0,不发送。而ClientAliveInterval 60表示每分钟发送一次,然后客户端响应,这样就保持长连接了。这里比较怪的地方是:不是客户端主动发起保持连接的请求(如FTerm, CTerm等),而是需要服务器先主动。
- ClientAliveCountMax,使用默认值3即可。ClientAliveCountMax表示服务器发出请求后客户端没有响应的次数达到一定值,就自动断开,正常情况下,客户端不会不响应。
参考链接1:解决SSH自动断线,无响应的问题。
参考链接2:ssh执行远程命令的坑
- 后台执行命令
nohup sh ./ha_test.sh > run.log 2>&1 &
- 建立swap分区 从系统分区分出来
用文件作为Swap分区
dd if=/dev/zero of=/root/swapfile bs=1M count=4096
mkswap /root/swapfile
swapon /root/swapfile
- 缺少动态连接库.so--cannot open shared object file: No such file or directory
---修改/etc/ld.so.conf,然后刷新
vim /etc/ld.so.conf
add /where/you/install/lib
sudo ldconfig
参考 : 缺少动态连接库