Keen的博客

记录所思、所想、所遇

欢迎来到我的个人站~


【操作指令】Linux命令

1. Shell常规用法

1.1. 基础语法

# 开头放置以下这个,表示用的bash来执行shell
#!/bin/bash

# 获取当前路径
cur_dir=$(cd `dirname $0`; pwd)

# 获取脚本名称
shell_name="$(basename "$0")"

# 递归创建目录
mkdir -p "~/test1/test2"

# 参数传递$*
main $*

1.2. 条件判断

# 判断目录是否存在
if [ ! -d "~/test" ]; then
   echo "~/test not exist."
fi

# 判断文件是否存在
if [ ! -f "~/test.txt" ]; then
   echo "~/test.txt not exist."
fi

# 判断变量是否有值
if [ ! -n "$var" ]; then
   echo "$var is empty"
fi

# 判断变量是否相等
if [ "$var1" = "$var2" ]; then
   echo '$var1 eq $var2'
else
   echo '$var1 not eq $var2'
fi

# 判断命令是否存在
type cmake >/dev/null 2>&1
if [ $? -eq 0 ]; then
   echo "cmake exist."
else
   echo "cmake not exist."
fi

# 判断命令是否存在(更通用)
command -v cmake >/dev/null 2>&1
if [ $? -eq 0 ]; then
   echo "cmake exist."
else
   echo "cmake not exist."
fi

#判断字符串是否相等
if [ "$A" = "$B" ];then
   echo "[ = ]"
fi
 
#判断字符串是否相等,与上面的=等价
if [ "$A" == "$B" ];then
   echo "[ == ]"
fi

#注意:==的功能在[[]]和[]中的行为是不同的,如下
 
#如果$a以”a”开头(模式匹配)那么将为true 
if [[ "$A" == a* ]];then
   echo "[[ ==a* ]]"
fi
 
#如果$a等于a*(字符匹配),那么结果为true
if [[ "$A" == "a*" ]];then
   echo "==/"a*/""
fi

打日志

info() {
    echo -e "\033[36m${1} \033[0m"
}

step() {
    echo -e "\033[32m[step] ${1} \033[0m"
}

warn() {
    echo -e "\033[33m${1} \033[0m"
}

error() {
    echo -e "\033[31m[err] ${1}\033[0m"
}

1.3. 循环

1.4. 参数解析

1.5. 字符串操作

1.5.1. 字符串截取

1.5.2. 大小写转换

1.5.3. 字符串替换

1.6. 文本操作

1.6.1. 文本替换

1.7. 高级通用语法

1.7.1. 增加sudo账户

# 切换到root账户
su root

# 打开sudo配置
visudo

# 增加自己的账户到sudo账户列表
keencentos8 ALL=(ALL) ALL

# 也可以让自身用户无需输入密码来执行任意命令
keencentos8 ALL=(ALL) NOPASSWD: ALL

2. CentOS命令

# 系统信息
查看系统版本号:cat /proc/version
修改主机名字:hostnamectl set-hostname admin_keam
查看主机信息:hostnamectl
查看CentOS版本号:cat /etc/redhat-release
增加账户:useradd admin_keam   设置账户密码:passwd admin_keam   给新账户增加sudo权限命令:visudo(然后在打开的文件里,找到root ALL(ALL) ALL,往下新增一行admin_keam ALL(ALL) ALL)
更改文件或文件夹所属用户组:chown -R admin_keam /etc/elasticsearch

# 便捷工具
以json格式化展示数据(安装jq):cat xxxx.txt | jq
显示时间戳对应的具体时间:date -d @1594088377 "+%Y-%m-%d %H:%M:%S"
动态监控文件修改:tail -f filexxxx

# 资源信息
查看运行进程:ps -aux
查看资源占用情况:top
查看网络资源使用情况(按进程排序展示):nethogs
查看网络端口占用情况:netstat -tunlp
查看磁盘空间:df -h
查看根目录下各个文件占用情况:du -ah --max-depth=1  /
查看某个目录占用:du -bsh /usr/
查看当前目录下所有文件的磁盘占用:ll -Sh

# 安装
查看安装软件:yum list installed | grep elasticsearch.noarch
卸载安装软件:yum remove elasticsearch.noarch
安装软件RPM:rpm -ivh filebeat-1.0.1-x86_64.rpm

# 文件路径
查看隐藏文件:ls -a
查看文件安装路径:whereis logstash
删除目录:rm -rf firefox
全系统查找文件:find / -name rabbitmq

# 服务
关闭服务:systemctl stop firewalld.service
关闭服务自启动:systemctl disable firewalld.service
查看服务状态:systemctl status firewalld.service

# 压缩解压缩
安装zip和unzip命令:yum install zip unzip
解压.zip文件:unzip client.zip
压缩.zip文件:zip -r client.zip client
解压.tgz文件:tar zxvf client.tgz -C client

# ssh
ssh登入:ssh username@ip -p 22
ssh登出:logout
ssh传输:rz -bey
ssh接收:sz xxxx
远程执行命令:sshpass -p passwdxxx ssh -p 22 root@192.168.190.110 "source /etc/profile; cleanenv.sh"  # 注意:远程执行的时候,/etc/profile的全局环境变量是不加载的,只加载bashrc的环境变量,所以这里用到了的话,要动态加载一下
自动化命令:expect {cmd_file}  
-----------{cmd_file}-------------
#!/usr/bin/expect -f
set timeout 10
set host "10.211.55.3"
set username "root"
set password "123456"
spawn ssh $username@$host
expect "*password*" {send "$password\r"}
interact
----------------------------------

# 编辑
覆盖写字符串到文件中:echo "xxxxxx" > /root/test.txt
追加写字符串到文件中:echo "xxxxxx" >> /root/test.txt
全文替换:sed -i 's/old string/new string/g' file
删除以什么打头的某行:sed -i '/^something/d' file

# 命令执行
后台运行:nohup ./xxxx &
# 如果想执行一连串命令,发现有各种相互依赖关系,可以按照如下方式执行。例如,这里想把对应的
a="$(who am i | awk '{print $2}')"; who | awk '{print $2}' | grep -v $a | xargs -n 1 pkill -9 -t

# 条件判断
判断是否存在某个命令:if type printf > /dev/null; then todo fi
判断文件是否可执行:if test -x /usr/ucb/echo; then todo fi

3. CentOS7安装软件遇到的问题

CentOS中安装Python3.6简单方法:https://blog.51cto.com/wenguonideshou/2083301
CentOS安装pip失败:https://www.cnblogs.com/saolv/p/6963314.html

4. CentOS中配置静态上网的方法

# 虚拟机中NAT模式下CentOS配置静态ip上网:
(1)首先配置静态ip:vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
HWADDR="00:0C:29:6C:BB:E6"
NM_CONTROLLED="yes"
ONBOOT="no"
NETMASK=255.255.255.0
IPADDR=192.168.0.8
GATEWAY=192.168.0.1     # 网关也必须设置,否则无法上网
BOOTPROTO=static        # 这个是核心,默认是dncp
ONBOOT=yes     # 这个必须设置,否则network无法工作
PEERDNS=yes
(2)宿主机(windows)找到本机dns服务器:cmd下,ipconfig
以太网适配器 以太网:

   DHCPv6 IAID . . . . . . . . . . . : 372284451
   DHCPv6 客户端 DUID  . . . . . . . : 00-01-00-01-24-56-C9-BD-1A-F6-43-46-7D-5B
   DNS 服务器  . . . . . . . . . . . : 10.11.56.23
                                       10.11.56.22
                                       10.14.0.131
                                       10.14.0.130

(3)配置CentOS中的dns:vim /etc/resolv.conf
nameserver 10.11.56.23
nameserver 10.11.56.22
nameserver 10.14.0.131
nameserver 10.14.0.130  
# 注意,如果是虚拟机,dns可以设置成网关,比如192.168.0.1
(4)重启network服务:service network restart

注意:如果是两台虚拟机拷贝,即使像上面这样修改了,有一台还是无法上网,原因是mac地址冲突了,两台虚拟机的mac地址一样。这个时候需要修改一下mac地址。
关闭虚拟机,然后编辑***.vmx文件,找到:

ethernet0.addressType = "generated"
uuid.bios = "56 4d ed 23 13 8c 96 91-7c 68 b2 09 8b aa bb cc"
ethernet0.generatedAddress = "00:0c:29:aa:bb:cc"

其中,uuid.bios的后6个数字,就是动态生成的网卡地址的后6位,将这后几位修改掉,就可以改变MAC地址值
# windows(10.17.14.12) ——> vm centos(192.168.2.132) ——> vm centos(172.17.0.2),如何建立隧道访问到虚拟机中的虚拟机
参考:https://eternalcenter.com/?p=2843

5. mac下,安装vbox(内部centos),解决vbox内虚拟机上网问题

首先,解决虚拟机内部上网问题,使用NAT网络上网
step1:配置NAT网络。vbox全局设置菜单:VirtualBox ——> 偏好设置 ——> 网络 ——> NAT网络 ——> 添加(假设命名为NatNetwork);不使用dncp,记住网段10.0.2.0 png step2:配置vbox虚拟机CentOS的网络设置。网络 ——> 网卡1 ——> 连接方式:NAT网络;界面名称:NatNetwork png step3:进入vbox centos系统内,参照# CentOS中配置静态上网的方法,注意使用10.0.2.1作为网关
step4:test,看虚拟机是否能上网:ping www.baidu.com;看虚拟机是否能联通主机:ping 192.168.31.118
step5:关闭防火墙。systemctl stop firewalld.service(关闭防火墙);systemctl disable firewalld.service(禁止开机启动)
step6:主机尝试ping一下虚拟机(假设静态ip设置为:10.0.2.100),结果是ping不通。此时在宿主机上,ifconfig看不到任何虚拟网卡指向vbox,是因为没有开通host访问。下面步骤是开通虚拟机允许host访问。
step7:创建vbox主机访问虚拟网卡。vbox全局设置菜单 ——> 管理 ——> 主机网络管理器 ——> 创建一个虚拟网卡vboxnet0
png step8:配置虚拟机centos设置,网卡2,host主机访问,选中刚创建的vboxnet0
step9:进入centos虚拟机中,cp一份虚拟机内部网卡配置。

cd /etc/sysconfig/network-scripts  
cp ifcfg-ensp03 ifcfg-ensp08  
vim ifcfg-ensp03  
# 增加HWADDR=xx:xx:xx:xx:xx:xx(这个mac地址,在虚拟机centos设置中网卡高级选项中查看,写成:分割形式)uuid两个配置文件要保证不一样
vim ifcfg-ensp08
# 增加HWADDR=xx:xx:xx:xx:xx:xx,注意修改uuid
# 修改ip地址和网关,注意网段是刚刚生成的192.168.56.xx

step10:重启网卡设置。service network restart step11:如果宿主机mac想要ssh到centos,还需要centos开启sshd服务。systemctl restart sshd。然后mac上ssh root@192.168.56.100即可

6. Ubuntu命令

Ubuntu登陆启用root用户登陆:
$ sudo passwd root
$ sudo vi /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf
添加如下:
greeter-show-manual-login=true

# 重启,选中login登陆,输入root和密码即可

不让控制台显示全路径
$ vim ~/.bashrc
将所有的w修改为W即可

注意,还需要将/root/.profile结尾的mesg n那行,替换为tty -s && mesg n

另外,为了能正常ssh连接,需要手动安装apt-get install openssh,同时,为了能正常ssh到root用户,需要修改ssh服务配置,如下:
$ /etc/ssh/sshd_config
#PermitRootLogin without-password
PermitRootLogin yes
然后重启ssh服务即可:service ssh restart

7. 遇到的一些问题

问题1:配置了DHCP导致DNS是动态获取的,但是如果知道动态脚本分发的dns不满足要求,还需要增加一个的话,怎么加呢?直接加到/etc/resolv.conf,因为是动态的,重启network的话,又会回滚掉?

# /etc/sysconfig/network-script/ifcfg-eth0,这个文件是用来控制网络相关,优先级最高的,无论什么脚本,这里有的选项,都必须加上。所以,如果动态分配的dns不满足,则直接增加一个即可
ifconfig # 查看具体对应的iface,加入这里找到的是eth0
cd /etc/sysconfig/network-script/
ls # 查找上面iface:ifg-eth0
vim /etc/sysconfig/network-script/ifcfg-eth0
# 在这里添加一项进去:DNS1=8.8.8.8

# ifg-eth0文件如下:

# Created by cloud-init on instance boot automatically, do not edit.
#
BOOTPROTO=dhcp
DEVICE=eth1
NM_CONTROLLED=no
ONBOOT=yes
PERSISTENT_DHCLIENT=yes
TYPE=Ethernet
USERCTL=no
DNS1=8.8.8.8   # 我们添加的,还可以增加DNS2、DNS3等

问题2:已知两个网络,telnet对应端口可以连通,但是http不通怎么办?

# 首先,需要排查有无全局代理,或者对应网络走的哪个代理
# 其次,需要排查防火墙的设置

8. CentOS忘记root密码

  • Step1:系统启动时,进入选择页面,按[e]进入Step2
    png
  • Step2:在“linux16”命令最后加上“init=/bin/sh”,按[Ctrl+x]进入单用户模式
    png
  • Step3:执行以下命令,修改密码
    # 将所有文件设置为可读写模式
    mount -o remount,rw /
    # 输入以下命令回车,会要求填写新的root密码
    passwd
    # 修改系统时间标签
    touch /.autorelabel
    # 重启系统
    exec /sbin/init
    

9. Mac下命令

# mac os 10.15版本

# 清除dns缓存
sudo dscacheutil -flushcache

10. Bash Shell常用





打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少