lscpu:查看cpu的统计信息
cat /proc/cpuinfo:查看cpu详细信息
free –m:查看内存情况
cat /etc/meminfo:查看内存详细信息
lsblk:查看硬盘分区分布
df –lh:查看各分区的情况
cat /proc/partitions:查看硬盘和分区
uname –a:查看版本,当前 *** 作系统内核信息
cat /proc/version:查看当前 *** 作系统版本信息
cat /etc/redhat-release:查看系统发行版信息
ifconfig:查看所有网络接口
netstat tnlp:查看所有监听端口
netstat –at:查看所有tcp端口
netstat –au:查看所有udp端口
top:查看系统所有进程的详细信息:比如cpu、内存等信息
hostname:查看计算机名
w:查看活动用户
id:查看指定用户信息
last:查看用户登录日志
rpm –qa:显示所有可安装的程序包
uptime:查看系统运行时间,用户数,负载
ps –ef:查看所有进程
kill -9 进程名:杀死指定进程
scp 本地文件夹 目标机器用户名@目标机器IP:目标目录:拷贝本地文件夹到远程机器上
scp -r本地目录 目标机器用户名@目标机器IP:目标目录:拷贝本地目录到远程机器上
rpm –qa | grep 软件名称:查看本机是否安装了该软件
rpm –ivh xxx.rpm:安装xxx
yum install xxx:在线安装xxx
rpm –e xxx:删除已经安装的xxx
yum repolist all:列出所有仓库
Linux系统的shell作为 *** 作系统的外壳,为用户提供使用 *** 作系统的接口。它是命令语言、命令解释程序及程序设计语言。
shell是用户和Linux内核之间的接口程序,如果把Linux内核想象成一个球体的中心,shell就是围绕内核的外层。当从shell或其他程序向Linux传递命令时,内核会做出相应的反应。
shell是一个命令语言解释器,它拥有自己内建的shell命令集,shell也能被系统中的其他应用程序所调用。用户在提示符下输入的命令都由shell先解释然后传给Linux核心。
Linux常用的shell有哪些?
1、Bourne shell
Bourne shell是一个交换式的命令解释器和命令编程语言。
Bourne shell是标准的UNIX shell,以前常被用来做为管理系统之用。大部分的系统管理命令文件,例如rcstart、stop与shutdown都是Bourne shell的命令档,且在单一使用者模式下以root签入时它常被系统管理者使用。Bourneshell是由AT$T发展的,以简洁、快速著名,Bourne shell提示符号的默认值是$。
2、C shell
C shell是一种比Bourneshell更适合的变种shell,使用的是类C语言,csh是具有C语言风格的一种shell,其内部命令有52个,比较庞大。
C shell是柏克莱大学所开发的,且加入了一些新特性,如命令列历程、别名、内建算术、档名完成和工作控制。对于常在交谈模式下执行shell的使用者而言,他们较喜欢用C
shell但对于系统管理者而言,则较偏好以Bourne shell来做命令档,因为Bourne shell命令档比C shell命令档来的简单及快速。C shell提示符号的默认值是%。
3、korn shell
korn shell是一个Unix shell,它由贝尔实验室的David Korn在二十世纪八十年代早期编写。它完全向上兼容Bourne shell并包含了c shell的很多特性,例如贝尔实验室用户需要的命令编辑。
Korn shell是Bourne shell的超集,由AT&T的David korn所开发。它增加了一些特色,比C shell更为先进。Korn shell的特色包括了可编辑的历程、别名、函式、正则表达式万用字符、内建算术、工作控制、共作处理和特殊的除错功能。Korn shell提示符号的默认值也是$。
姓名:罗学元 学号:21181214375 学院:广州研究院
【嵌牛导读】shell命令解释器该包含哪些部分
【嵌牛鼻子】shell命令解释器该包含哪些部分
【嵌牛提问】shell命令解释器该包含哪些部分
我们所做的这个简单的shell命令解释器可以实现简单的常用的基本命令,如ls、pwd、cd、cd - 、cd ~ 等
根据简单命令的定义,它的第一个参数是要执行的命令,后面的参数作为该命令的参数。
要执行的命令有两种情况:
一种是外部命令: 也就是对应着磁盘上的某个程序,例如 pwd、ls等等。对于这种外部命令,我们首先要到指定的路径下找到它,然后再执行它。
另一种是内部命令:内部命令并不对应磁盘上的程序,例如cd等等,它需要shell自己来决定该如何执行。例如对 cd 命令,shell就应该根据它后面的参数改变当前路径。
对于外部命令,需要创建一个子进程来执行它,本质就是fork+exec
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include <pwd.h>
#include <sys/utsname.h>
#include <sys/types.h>
#include <unistd.h>
#define MAX 10
#define STRLEN 128
#define PATH "/bin/" //系统bin路径位置
char OLDPWD[STRLEN]={0}//记录上一次的命令,为了cd -这条命令
//================================================================================
//每次敲回车输出当前所在用户信息
//普通用户和root用户的提示符区别
void Printf_Info()
{
char flag='$'
struct passwd *pw=getpwuid(getuid())
assert(pw!=NULL)
//uid为0则为root用户
if(pw->pw_uid==0)
{
flag='#'
}
struct utsname hostname//主机名
uname(&hostname)
char node[STRLEN]={0}
strcpy(node,hostname.nodename)//获取网络上的名称
char* name=strtok(node,".")
//获取绝对路径
char path[STRLEN]={0}
getcwd(path,STRLEN-1)
char*p=path+strlen(path)//p指向绝对路径的末尾
while(*p!='/')
{
p--
}
//p指向路径末尾往前的第一个‘/’位置处
if(strlen(path)!=1)
{
p++//++前,p->'/'
}
if(strcmp(path,pw->pw_dir)==0)
{
p="~"
}
printf("\033[32mMyBash[%s@%s %s]%c\033[0m",pw->pw_name,name,p,flag)
// \033[4731mThis is a color test\033[0m 设置打印结果的颜色
fflush(stdout)
}
//================================================================================
void Mycd(char*path)
{
//第一个字符串为cd而第二为空 如:cd 则结束本轮循环
if(path==NULL)
{
exit(0)
}
//cd ~ 回到用户根目录
if(strcmp(path,"~")==0)
{
struct passwd*pw=getpwuid(getuid())
path=pw->pw_dir
}
//cd - 回到上一次的位置
if(strcmp(path,"-")==0)
{
//若是第一次输入命令,则cd -命令不存在!
if(strlen(OLDPWD)==0)
{
printf("\033[31mMyBash:cd:OLDPWD not set\n\033[0m")
return
}
//否则把上一次的命令给path
path=OLDPWD
}
//getpwd记录当前工作目录的绝对路径
char oldpwd[STRLEN]={0}
getcwd(oldpwd,STRLEN-1)
if(-1==chdir(path))//反之则不是空,则通过chdir系统调用进入到该目录中
{
char err[128]="\033[31mMybash: cd \033[0m"
strcat(err,path)
perror(err)
}
//每次执行完cd命令后,把工作路径赋给OLDPWD
strcpy(OLDPWD,oldpwd)
}
//================================================================================
//命令分割函数
void Strtok_cmd(char*buff,char*myargv[])
{
char *s=strtok(buff," ")//分割输入的字符串
if(s==NULL) //如果s为空,则进入下一轮循环
{
exit(0)
}
myargv[0]=s//把分割出来的第一个字符串放在myargv[0]中
int i=1
while((s=strtok(NULL,""))!=NULL) //把后续分割出来的字符串依次存放在数组中
{
myargv[i++]=s
}
}
//===============================================================
int main()
{
while(1)
{
char buff[128]={0}
Printf_Info()
//从终端获取命令存入buff中
fgets(buff,128,stdin)
buff[strlen(buff)-1]=0
char *myargv[MAX]={0}
//分割输入的命令
Strtok_cmd(buff,myargv)
//如果输入exit则退出循环
if(strcmp(myargv[0],"exit")==0)
{
exit(0)
}
//如果分割出来的第一个字符串为cd
else if(strcmp(myargv[0],"cd")==0)
{
Mycd(myargv[1])
continue
}
//若是系统调用,直接替换fork+exec
pid_t pid=fork()
assert(pid!=-1)
if(pid==0)
{
char path[256]={0}
if(strncmp(myargv[0],"./",2)!=0 &&strncmp(myargv[0],"/",1)!=0)
{
//先把路径放入path中
strcpy(path,PATH)
}
//进行命令拼接,路径+名称
strcat(path,myargv[0])
//替换进程 例如:/bin/ls
execv(path,myargv)
perror("\033[31mexecv error\033[0m")
}
//处理僵死进程
else
{
wait(NULL)
}
}
}
运行结果如下 :
异常处理如下:
若是第一次运行程序,则不能使用cd - 命令,因为此时还没有历史路径
若进入一个不存在的目录则会报错,没有这个文件或目录
若直接输入一个不存在的无法识别的命令,也会报错。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)