modem问题:如何向modem发送AT command,并接收其返回值

huaboy2004 2005-11-19 09:29:16
如题!
另外如果能实现向其发送数据包,并接收校验更好。
网上有个PassMark ModemTest,功能好像就是这样的,但是就是不知道实现原理。
哪位大侠对modem有所研究的话,望不吝赐教,谢谢。

PS:哪位感兴趣的,可以先看看PassMark的小软件
http://www.passmark.com/download/index.htm
...全文
267 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
huaboy2004 2006-03-11
  • 打赏
  • 举报
回复
能不能把BreaKing和38062708的分调过来,斑竹帮帮忙了,谢谢。
huaboy2004 2006-03-11
  • 打赏
  • 举报
回复
靠,给分也给错了
怎么能改回来
huaboy2004 2006-03-11
  • 打赏
  • 举报
回复
郁闷,结贴!
38062708 2005-12-06
  • 打赏
  • 举报
回复
向 MODEM 发送数据包?

不懂你的意思,我推测是向 MODEM 连接的另一端 PC 发送数据包。

通常应该先拨号,ATD 电话号码,记得加“;”
然后就可以传输数据了,返回命令状态发命令“+++”
挂断用ATH
BreaKing 2005-12-03
  • 打赏
  • 举报
回复
你的那个串口类做得也太简单了...
你能保证writefile或者readfile的时候不会出错吗?
向modem发数据的方式估计要到modem厂商网站上查询资料了
huaboy2004 2005-11-29
  • 打赏
  • 举报
回复
我上面所说的都是基于一台PC加上一个modem,不是要两个modem之间的数据传送
huaboy2004 2005-11-29
  • 打赏
  • 举报
回复
现在就差另外一个问题了,如何向modem发送一个数据包,并且校验接收是否正确。
不知道需要对modem做什么设置,才能让其有这样的功能,大家提供一下思路啊,谢谢了!
huaboy2004 2005-11-29
  • 打赏
  • 举报
回复
发送AT command的问题解决了,大概就是沿用下面的思路,大家可以参考一下。


下面是打开、写入、读出串口数据的函数实现
#include "StdAfx.h"
#include ".\commanager.h"
#using <mscorlib.dll>

//#include "Windows.h"
//#include "Winbase.h"
//API Requirements
//Header: Declared in Winbase.h; include Windows.h.
//Library: Use Kernel32.lib.

comManager::comManager(void)
{
}

comManager::~comManager(void)
{
}

// 串口设置
void comManager::SetCommPort()
{
DCB dcb;

DWORD dwError;
BOOL fSuccess;

hCom=CreateFile("COM1",
GENERIC_READ|GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,// non-overlapped
NULL
);
if(hCom == INVALID_HANDLE_VALUE)
{
//To get extended error information, call GetLastError
dwError = GetLastError();

MessageBox(NULL,"ERROR","OK",MB_OK);

return;
}

// 获取串口当前配置
fSuccess = GetCommState(hCom,&dcb);
if(!fSuccess)
{
MessageBox(NULL,"Get configuration port has problem","OK",MB_OK);
return;
}

// 设置串口参数
dcb.DCBlength = sizeof(DCB);
dcb.BaudRate = 19200;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;

fSuccess = SetCommState(hCom,&dcb);
if(!fSuccess)
{
MessageBox(NULL,"Failed to open ComProt","OK",MB_OK);

return;
}
else
{
MessageBox(NULL,"ComPort Opened","OK",MB_OK);
}

// COMMTIMEOUTS对象,以毫秒为单位
COMMTIMEOUTS comTimeOut;
// 接收时,两字符间最大的时延
comTimeOut.ReadIntervalTimeout = MAXDWORD;//3;
// 读取每字节的超时.
comTimeOut.ReadTotalTimeoutMultiplier = 10;//3;
// 读串口数据的固定超时
// 总超时 = ReadTotalTimeoutMultiplier * 字节数 + ReadTotalTimeoutConstant
comTimeOut.ReadTotalTimeoutConstant = 10;//2;
// 写每字节的超时.
comTimeOut.WriteTotalTimeoutMultiplier = 20;//3;
// 写串口数据的固定超时
comTimeOut.WriteTotalTimeoutConstant = 50;//2;

// 将超时参数写入设备控制.
SetCommTimeouts(hCom,&comTimeOut);

// 设置输入/出缓冲
SetupComm(hCom,1024,512);

// 清空输入/出缓冲
PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);
}

// 读取串口
void comManager::ReadPort(char strReceive[], int length)
{
BOOL rf;
unsigned long nNum;

// 读取length字节到strReceive[]缓冲区
rf = ReadFile(hCom, strReceive, length, &nNum, ULL);

if(!rf)
{
MessageBox(NULL,"read failed","OK",MB_OK);
}
}

// 写入串口
void comManager::WritePort(char strSend)
{
BOOL wf;
unsigned long nNum;

// 写入一个字节
wf = WriteFile(hCom, &strSend, 1, &nNum, NULL);

if(!wf)
{
MessageBox(NULL,"write failed","OK",MB_OK);
}
}

// 关闭串口
BOOL comManager::Close()
{
if(hCom != INVALID_HANDLE_VALUE)
{
return CloseHandle(hCom);
}
return true;
}
////////////////////////////////////

这里是发送AT指令的源码,发送"AT"应该返回"OK"
// 发送AT指令
private: System::Void btnCmd_Click(System::Object * sender, System::EventArgs * e)
{
char strSend[] = {'A', 'T', '\r'};// '\r'
char strReceive[1024];
int length;

for(int i=0; i<3; i++)
{
this->m_comManager->WritePort(strSend[i]);// 写入串口
}

length = S"OK"->Length;
this->m_comManager->ReadPort(strReceive, length);// 读取串口
for(int j=0; j<length; j++)
{
textBoxReceive->Text = String::Concat(textBoxReceive->Text, strReceive[j].ToString());
}
}
Pipi0714 2005-11-23
  • 打赏
  • 举报
回复
只要有个控制串口的类即可。AT指令只要上网或者正规厂家的Modem在说明书中都有
yayaniuniu502 2005-11-20
  • 打赏
  • 举报
回复
帮顶一个,难!
短信内容的存储类 /*** * CommonSms 短信用于全局变量 */ public class CommonSms{ /** id */ private int id; /**短信内容*/ private String smstext; /**短信发送方*/ private String sender;//短信发送方 /**短信接收发*/ private String recver;//短信接收发 /**时间*/ private Date date; public String getSmstext() { return smstext; } public void setSmstext(String smstext) { this.smstext = smstext; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } public int getId() { return id; } public void setId(Integer id) { this.id = id; } public String getSender() { return sender; } public void setSender(String sender) { this.sender = sender; } public String getRecver() { return recver; } public void setRecver(String recver) { this.recver = recver; } } 串口操纵实现类 /*** * 串口操纵实现类 */ public class Port { private CommPortIdentifier portId; private SerialPort serialPort; private OutputStreamWriter out; private InputStreamReader in; private String COMname; private static char symbol1 = 13; public String getCOMname() { return COMname; } public void setCOMname(String mname) { COMname = mname; } public CommPortIdentifier getPortId() { return portId; } public void setPortId(CommPortIdentifier portId) { this.portId = portId; } public SerialPort getSerialPort() { return serialPort; } public void setSerialPort(SerialPort serialPort) { this.serialPort = serialPort; } public OutputStreamWriter getOut() { return out; } public void setOut(OutputStreamWriter out) { this.out = out; } public InputStreamReader getIn() { return in; } public void setIn(InputStreamReader in) { this.in = in; } public boolean isused =true; public boolean isIsused() { return isused; } public void setIsused(boolean isused) { this.isused = isused; } /** * 打开com口 * @param portName * @return */ public Port(String portName) { try { portId = CommPortIdentifier.getPortIdentifier(portName); if (portId == null) { System.out.println("port is null"); } try { serialPort = (SerialPort) portId.open(portName,100000); } catch (PortInUseException e) { System.gc(); e.printStackTrace(); } // 下面是得到用于和COM口通讯的输进、输出流。 try { in = new InputStreamReader(serialPort.getInputStream()); out = new OutputStreamWriter(serialPort.getOutputStream()); } catch (IOException e) { System.gc(); System.out.println("IOException"); } // 下面是初始化COM口的传输参数,如传输速率:9600等。 try { serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); setCOMname(portId.getName()); setIsused(true); } catch (UnsupportedCommOperationException e) { e.printStackTrace(); System.gc(); } } catch (NoSuchPortException e) { e.printStackTrace(); System.gc(); } } /** * 检查SIM是否存在 * @return */ public boolean chakanPort() { try { String atCommand = "AT+ccid"; String strReturn = sendAT(atCommand); if (strReturn.indexOf("OK", 0) != -1) { return true; } return false; } catch (Exception ex) { System.gc(); ex.printStackTrace(); return false; } } /** * 封闭COM口 * @return boolean */ public void close() { try { in.close(); out.close(); } catch (IOException e) { e.printStackTrace(); } serialPort.close(); System.gc(); setIsused(false); } /** * 向串口中写进字符串命令 * @param s 字符串命令 * @throws Exception 异常 */ public void writeln(String s) throws Exception { out.write(s); out.write('\r'); out.flush(); } /** * 读取COM命令的返回字符串 * @return 结果字符串 * @throws Exception */ public String read() throws Exception { int n, i; char c; String answer = ""; for (i = 0; i < 100; i++) { while (in.ready()) { n = in.read(); if (n != -1) { c = (char) n; answer = answer + c; Thread.sleep(1); } else break; } if (answer.indexOf("OK") != -1) { break; } Thread.sleep(100); } return answer; } /** * 向串口发送AT指令 * @param atcommand 指令内容 * @return 指令返回结果 * @throws java.rmi.RemoteException */ public String sendAT(String atcommand) throws java.rmi.RemoteException { String s = ""; try { Thread.sleep(100); writeln(atcommand); Thread.sleep(80); s = read(); Thread.sleep(100); } catch (Exception e) { System.gc(); System.out.println("ERROR: send AT command failed; " + "Command: " + atcommand + "; Answer: " + s + " " + e); } return s; } } 短信操纵类 /*** * 短信操纵类 */ public class Sms{ private CommonSms commonsms; private static char symbol1 = 13; private static String strReturn = "", atCommand = ""; public boolean SendSms(Port myport) { if(!myport.isIsused()) { System.out.println("COM通讯端口未正常打开!"); return false; } setMessageMode(myport,1); // 空格 char symbol2 = 34; // ctrl~z 发送指令 char symbol3 = 26; try { atCommand = "AT+CSMP=17,169,0,08" + String.valueOf(symbol1); strReturn = myport.sendAT(atCommand); System.out.println(strReturn); if (strReturn.indexOf("OK", 0) != -1) { atCommand = "AT+CMGS=" + commonsms.getRecver() + String.valueOf(symbol1); strReturn = myport.sendAT(atCommand); atCommand = StringUtil.encodeHex(commonsms.getSmstext().trim()) + String.valueOf(symbol3) + String.valueOf(symbol1); strReturn = myport.sendAT(atCommand); if (strReturn.indexOf("OK") != -1 && strReturn.indexOf("+CMGS") != -1) { System.out.println("短信发送成功..."); return true; } } } catch (Exception ex) { ex.printStackTrace(); System.out.println("短信发送失败..."); return false; } System.out.println("短信发送失败..."); return false; } /** * 设置消息模式 * @param op * 0-pdu 1-text(默认1 文本方式 ) * @return */ public boolean setMessageMode(Port myport,int op) { try { String atCommand = "AT+CMGF=" + String.valueOf(op) + String.valueOf(symbol1); String strReturn = myport.sendAT(atCommand); if (strReturn.indexOf("OK", 0) != -1) { System.out.println("*************文本方式设置成功************"); return true; } return false; } catch (Exception ex) { ex.printStackTrace(); return false; } } /** * 读取所有短信 * @return CommonSms集合 */ public List RecvSmsList(Port myport) { if(!myport.isIsused()) { System.out.println("System Message: COM通讯端口未正常打开!"); return null; } List listMes = new ArrayList(); try { atCommand = "AT+CMGL=\"ALL\""; strReturn = myport.sendAT(atCommand); listMes = StringUtil.analyseArraySMS(strReturn); } catch (Exception ex) { ex.printStackTrace(); } return listMes; } /** * 删除短信 * @param index 短信存储的位置 * @return boolean */ public boolean DeleteSMS(int index,Port myport) { if(!myport.isIsused()){ System.out.println("System Message: COM通讯端口未正常打开!"); return false; } try { atCommand = "AT+CMGD=" + index; strReturn = myport.sendAT(atCommand); if (strReturn.indexOf("OK") != -1) { System.out.println("System Message: 成功删除存储位置为" + index + "的短信......"); } } catch (Exception ex) { ex.printStackTrace(); } return true; } /** * 删除短信中所有短信 * @return boolean */ public boolean DeleteAllSMS(Port myport) { List list=RecvSmsList(myport); boolean ret=true; if(list!=null&&!list.equals("")&&list;.size()>0) { for(int i=0;i发送短信息 * @param phone * @param countstring * @throws Exception */ public static void sendmsn(String phone,String countstring){ Sms s = new Sms(); // 发送测试 CommonSms cs=new CommonSms(); cs.setRecver(phone); cs.setSmstext(countstring); s.setCommonsms(cs); Port myort=new Port("COM7"); s.SendSms(myort); myort.close(); } public static void main(String[] args) throws Exception { sendmsn("13265551149","我有一筐的愿看,却等不到一颗流星,闭上眼睛,我看到了我的前途"); } 指令字符串操纵类 /*** * 指令字符串操纵类 */ public class StringUtil { /** * 使用Sms 的RecvSms(int index)的方法时,使用该方法解析MODEM返回的字符串 * 根据MODEM返回的字符串,解析成一个CommonSms对象 * @param str 串口返回的读取短信结果字符串 * @param index 短信索引 * @return */ public static CommonSms analyseSMS(String str, int index) { CommonSms commonSms = new CommonSms(); String mesContent; String[] s = str.split("\""); int len = s.length; commonSms.setId(index); mesContent = s[len - 1]; if (mesContent.indexOf("OK") != -1) { mesContent = mesContent.substring(0, mesContent.indexOf("OK")); } mesContent = mesContent.trim(); commonSms.setSmstext(analyseStr(mesContent)); // 短信有中文时使用 // mes.setMessage(Unicode2GBK(analyseStr(mesContent))); SimpleDateFormat df = new SimpleDateFormat("yy/MM/dd hh:mm:ss"); String datestring = s[len - 2].substring(0, s[len - 2].length() - 3) .replace(',', ' ');// 短信时间格式09/09/09 20:18:01+32 Date date = null; try { date = df.parse(datestring); System.out.println(date.toLocaleString()); } catch (Exception ex) { System.out.println(ex.getMessage()); } commonSms.setDate(date); if (s[1].equals("REC READ")) { commonSms.setState("已读"); } else { commonSms.setState("未读"); } commonSms.setSender(s[3]); return commonSms; } /** * 使用Sms 的RecvSmsList()方法时,通过该方法解析MODEM返回来的字符串 * 根据MODEM返回的字符串,解析成一个CommonSms的集合对象 * @param str MODEM返回的字符串 * @return */ public static List analyseArraySMS(String str) { List mesList = new ArrayList(); CommonSms cs; String[] messages; String temp; String[] t; if (str.indexOf("CMGL: ") == -1) return null; str = str.substring(0, str.indexOf("OK")).trim(); messages = str.split("\n"); if (messages.length < 2) return null; for (int i = 1; i 5) { cs.setId(Integer.parseInt(t[0].trim())); temp = t[1].substring(t[1].indexOf('"') + 1, t[1].lastIndexOf('"')).trim(); if (temp.equals("REC READ")) { cs.setState("已读"); } else { cs.setState("未读"); } cs.setSender((t[2].substring(t[2].indexOf('"') + 1, t[2] .lastIndexOf('"')).trim())); SimpleDateFormat df = new SimpleDateFormat("yy/MM/dd hh:mm:ss"); String datestring = t[4].substring(t[4].indexOf('"') + 1) + " " + t[5].substring(0, t[5].indexOf('"'));// 短信时间格式09/09/09 // 20:18:01+32 Date date = null; try { date = df.parse(datestring); } catch (Exception ex) { System.out.println(ex.getMessage()); } cs.setDate(date); i++; cs.setSmstext(analyseStr(messages[i].trim())); mesList.add(cs); } } return mesList; } /** * 将PDU编码的十六进制字符串 如“4F60597DFF01” 转换成unicode "\u4F60\u597D\uFF01" * @param str 要转化的字符串 * @return 转换后的十六进制字符串 */ public static String analyseStr(String str) { StringBuffer sb = new StringBuffer(); if (!(str.length() % 4 == 0)) return str; for (int i = 0; i < str.length(); i++) { if (i == 0 || i % 4 == 0) { sb.append("\\u"); } sb.append(str.charAt(i)); } return Unicode2GBK(sb.toString()); } /** * 将unicode编码 "\u4F60\u597D\uFF01" 转换成中文 "你好!" * @param dataStr 要转化的字符串 * @return 转换后的中文字符串 */ public static String Unicode2GBK(String dataStr) { int index = 0; StringBuffer buffer = new StringBuffer(); while (index < dataStr.length()) { if (!"\\u".equals(dataStr.substring(index, index + 2))) { buffer.append(dataStr.charAt(index)); index++; continue; } String charStr = ""; charStr = dataStr.substring(index + 2, index + 6); char letter = 0; try{letter = (char) Integer.parseInt(charStr, 16);}catch (Exception e) {} buffer.append(letter); index += 6; } return buffer.toString(); } /** * 将中文字符串转换成Unicode * @param str 要转换的中文字符串 * @return 转换后的Unicode */ public static String GBK2Unicode(String str) { StringBuffer result = new StringBuffer(); for (int i = 0; i < str.length(); i++) { char chr1 = (char) str.charAt(i); if (!isNeedConvert(chr1)) { result.append(chr1); continue; } try{result.append("\\u" + Integer.toHexString((int) chr1));}catch (Exception e) {} } return result.toString(); } /** * 在中文字符串转换成Unicode方法中判定是否需要转换 * @param para 要转化的字符 * @return boolean */ public static boolean isNeedConvert(char para) { return ((para & (0x00FF)) != para); } /** * 使用Sms 的 SendSms()方法发送短信时,调用此方法将其短信内容转换成十六进制 * @param msg 短信内容 * @return 转换后的十六进制短信 */ public static final String encodeHex(String msg) { byte[] bytes = null; try { bytes = msg.getBytes("GBK"); } catch (java.io.UnsupportedEncodingException e) { e.printStackTrace(); } StringBuffer buff = new StringBuffer(bytes.length * 4); String b = ""; char a; int n = 0; int m = 0; for (int i = 0; i 0) { buff.append("00"); buff.append(b); n = n + 1; } else { a = msg.charAt((i - n) / 2 + n); m = a; try{b = Integer.toHexString(m);}catch (Exception e) {} buff.append(b.substring(0, 4)); i = i + 1; } } return buff.toString(); } }
第一部分 Linux简介和原理介绍 第一章 概述 1.1 Linux 的历史及背景 1.1.1 什么是 Linux? 1.1.2 Linux 该怎么念? 1.1.3 Linux 的历史 1.1.4 Linux的优点 1.2 Linux与开源软件 1.3 Linux 与 Windows 的比较 1.3.1 开发模式和系统架构的区别 1.3.2 局部的区别 1.4 Linux 与 Unix的比较 1.5 Linux 的发行版本和内核版本 1.6 Linux 的适用场合 1.7 Linux 的未来 第二章 Linux系统基本原理 2.1 Linux的体系结构以图来表现 2.2 基本特点 2.2.1 单核心 2.2.2 多用户的操作系统 2.2.3 分时机制 2.2.4 多任务运行 2.3 核心与模块(模块分类、进程,核心结构图) 2.4 文件系统的基本概念 2.4.1 概述 2.4.2 Linux目录结构 2.4.3 mount 2.4.4 主要文件系统类型 2.4.5 日志文件系统 2.4.6 i结点 2.5 线程与进程的基本概念 2.5.1 基本概念 2.5.2 僵尸进程 2.5.3 进程和多任务的实现 2.6 Linux设备与网络 2.7 Shell控制台 第二部分 基础知识 第三章 Shell命令使用 3.1 控制台相关命令 clear 命令 echo 命令 yes 命令 3.2 目录操作命令 cd 命令 pwd 命令 mkdir 命令 rmdir 命令 3.3 文件操作命令 ls 命令 touch 命令 cat 命令 more 和 less 命令 head 和 tail 命令 rm 命令 cp 命令 mv 命令 ln 命令 find 命令 file 命令 grep 命令 wc 命令 sort 命令 3.4 属性与权限命令 chown 命令 chgrp 命令 chmod命令 3.5 系统相关命令 date 命令 nice 命令 ps 命令 who 命令 vmstat命令 top 命令 kill 命令 df和du 命令 reboot 命令 shutdown 命令 logout 命令 3.6 Shell的高级使用 3.6.1 管道和重定向(“|、>、>>、<”) 3.6.2 进程管理(fg/bg、ctrl-Z、 &、nohup) 3.6.3 模式匹配 3.6.4 特殊字符 3.7 环境变量 3.7.1 环境变量的概念 3.7.2 相关的命令 第四章 vi使用 4.1 vi 编辑器简介 4.1.1 vi的简介 4.1.2 vim简介 4.2 打开和退出 vi 4.2.1 进入vi 4.2.2 vi的退出 4.2.3 打开文件、保存文件和退出 vi 编辑器 4.3 vi 的三种模式 4.3.1 vi 的输入模式(Insert mode) 4.3.2 vi 的命令模式(Command mode) 4.3.3 vi 的底线模式(Last line mode) 4.3.4 vi 三种模式的切换 4.4 在文件中快速移动光标 4.4.1 基本的移动方式 4.4.2 在同一行中移动光标 4.4.3 在页面间移动光标 4.4.4 在底线模式下移动光标 4.4.5 查找字符或者文字 4.5 在文件中替换和删除文本 4.5.1 命令模式中的替换命令 4.5.2 在底线模式中的替换命令 4.5.3 底线模式中的删除方式 4.6 撤销和重复编辑命令 4.7 移动和复制文本 4.7.1 文本行的移动 4.7.2 在底线模式中的整行移动 4.7.3 粘贴和复制 4.8 在 vi 编辑器中与 shell交互 4.9 编辑多个文件 4.10 vi的定制 第五章 shell编程 5.1 变量和运算符 5.1.1 变量替换 5.1.2 位置变量 5.1.3 进程变量 5.1.4 bash 引号规则 5.1.5 运算符 5.1.6 表达式替换 5.1.7 标准shell变量 5.1.8 影响命令的变量 5.2 过程 5.2.1 在过程内部使用变量 5.2.2 shift 命令 5.2.3 建立局部过程变量 5.2.4 过程返回值 5.3 脚本执行命令 5.3.1 exit 命令 5.3.2 trap命令 5.3.3 if 命令 5.3.4 case 命令 5.3.5 for 语句 5.3.6 while命令 5.3.7 until命令 5.3.8 break 命令 5.3.9 continue 命令 5 .4 控制shell 5.4.1 创建命令表 5.4.2 创建复合命令 5.4.3 输入/输出重定向 5.4.4 读取输入 5.4.5 使用“-”文件 5.4.6 使用设备文件 5.4.7 使用exec 5.4.8 使用eval 5.4.9 使用后台进程 5.5 Shell 程序调试 5.6 Shell 脚本的举例 第六章 高级脚本编程 6.1 awk 的介绍 6.1.1 什么是awk? (语法与操作) 6.1.2 使用awk功能 6.2 sed 的介绍 6.2.1 什么是sed? (语法与操作) 6.2.2 使用sed功能 6.3 正则表达式的使用 6.4 使用perl 6.4.1 perl特性 6.4.2 perl 入门 6.4.3 perl 变量 6.4.4 使用静态信息 6.4.5 使用倒引号字符串 6.4.6 使用语句 6.4.7 使用文件 6.4.8 特殊变量 6.4.9 对象 6.4.10 使用模块 6.4.11 perl 脚本举例 第三部分 系统管理 第七章 Linux管理介绍 7.1 系统管理员职责 7.1.1 一般的职责 7.1.2 用户的支持 7.2 超级用户 7.2.1 su命令 7.2.2 日常管理 7.3 文档 7.3.1 Linux相关书籍 7.3.2 Internet 7.3.3 man 7.3.4 info 7.3.5 应用程序自带的文档 7.3.6 how-to和mini-how-to 第八章 用户管理 8.1 用户管理简介 8.2 用户类型 8.2.1 超级用户 8.2.2 普通用户 8.2.3 特殊用户 8.3 账号配置文件 8.3.1 /etc/passwd 文件 8.3.2 /etc/shadow 文件 8.3.3 /etc/group 文件 8.4 用户的创建与维护 8.4.1 添加用户 8.4.2 修改用户属性 8.4.3 禁用用户 8.4.4 删除用户 8.4.5 改变用户属主和所有权 8.4.6 用户身份转换 8.5 组的创建与维护 8.5.1 添加组 8.5.2 删除组 8.5.3 修改组属性 8.5.4 改变用户组和所有权 8.6 用户查询 8.6.1 who和w命令 8.6.2 finger 命令 8.6.3 id 命令 8.7 用户管理与维护 8.7.1 受限root访问 8.7.2 环境文件 8.7.3 环境的定义 8.7.4 umask 8.7.5 day信息 8.7.6 guest帐号 8.7.7 共享的组目录 第九章 进程管理 9.1 创建进程和启动进程 9.2 进程调度: crond与atd 9.3 进程监控与统计 9.4 信号 9.4.1 信号的概念 9.4.2 kill 9.4.3 进程的挂起和恢复 9.5 daemon 9.5.1 概念 9.5.2 创建daemon 9.5.3 daemon用法 9.5.4 识别 第十章 文件系统 10.1 分区管理 10.1.1 分区概念 10.1.2 fdisk与parted命令 10.2 文件系统创建与维护 10.3 磁盘限额 10.4 文件和目录 10.4.1 访问控制 10.4.2 设定用户和组识别码 10.4.3 粘着位 10.4.4 文件权限命令 10.4.5 连接(LINK) 10.5 proc文件系统 10.6 SWAP 10.7 NFS 10.8 RAID 10.9 LVM 第十一章 文件与数据备份 11.1 为什么要备份? 11.2 备份什么? 11.3 备份策略 11.4 备份命令的选择 11.4.1 tar 的使用 11.4.2 gzip和compress 11.4.3 联合使用 11.4.4 cpio 命令 11.4.5 dump 命令 11.5 第三方备份软件 11.6 磁带机的介绍及使用 第十二章 软件包管理 12.1 rpm 基础 12.2 rpm 主要运行方式和常用选项 12.3 查找 rpm 信息 12.4 rpm 包的安装与删除 12.5 rpm 包的升级 12.6 rpm 命令的用法 12.7 使用rpmbuild构建自己的rpm包 12.8 软件的编译安装(./configure、make、make install等过程) 12.9 共享库 第十三章 启动过程和启动脚本 13.1 理解系统启动过程 13.2 GRUB与LILO 13.3 启动配置文件和命令 13.4 rc目录和相关脚本 13.4.1 理解 rc.d 目录 13.4.2 /etc/rc.d/rc.svsinit 脚本 13.4.3 理解 rc 脚本 13.4.4 理解 rc.6 目录下的其他脚本 13.4.5 checkconfig 脚本 第十四章 linux内核及设备管理 14.1 编译内核 14.1.1 准备源码 14.1.2 配置内核 14.1.3 编译 14.1.4 安装 14.2 模块 14.2.1 编译和安装 14.2.2 模块操作命令 14.2.3 配置 14.3 内核的调整 第十五章 日志管理 15.1 基本概述 15.2 日志子系统类别 15.3 日志文件使用 15.3.1 dmesg 15.3.2 messages 15.4 日志文件的后台进程 15.4.1 syslog 15.4.2 klogd 15.4.3 logger 15.5 logrotate 15.6 log文件的分析工具 15.6.1 swatch 15.6.2 其他工具 第十六章 打印管理 16.1 Linux打印体系概述 16.1.1 Linux打印原理 16.1.2 新旧打印方式对比 16.2 打印机的设置 16.2.1 添加打印机 16.2.2 通过命令行管理打印机 16.2.3 通过web界面管理打印机 16.3 使用CUPS打印 16.3.1 打印文件 16.3.2 选择打印机 16.3.3 标准打印选项 第十七章 基本网络配置与管理 17.1 网络环境概述 17.1.1 使用ADSL连接 17.1.2 普通modem拨号 17.1.3 局域网连接 17.2 网卡设置(着重) 17.2.1 网络设置的相关文件 17.2.2 IP、掩码、静态路由 17.2.3 DNS选项的配置 17.3 常用网络管理命令(ifconfig、netstat和route命令) (着重) 17.4 常用服务的管理 17.4.1 xinetd与inetd(重点为xinetd) 17.4.2 DHCP配置及启动 17.4.3 telnet配置及启动 17.4.4 FTP配置及启动 17.4.5 SSH配置及启动 第十八章 系统安全简介 18.1 安全漏洞 18.2 补丁在系统安全中的重要作用 18.3 主机安全 18.4 PAM 18.5 用户设置:口令规则、过期等 18.6 文件权限 18.7 setuid和setgid 18.8 缓冲区溢出的安全保护 18.9 网络安全设置 18.9.1 TCP封装 18.9.2 端口限制 18.9.3 防火墙iptables 18.10 简单攻击检测 18.11 使用安全工具 18.11.1 saint 18.11.2 SSH 18.11.3 tcplogd 18.11.4 swatch 18.11.5 tcpdump 18.11.6 whois 第十九章 系统优化和核心参数调整 19.1 系统性能与优化概述 19.2 性能监视与测试 19.3 系统优化的相关命令 19.3.1 uptime 19.3.2 free 19.3.3 top 19.3.4 vmstat 19.3.5 ps 19.4 系统优化措施 第二十章 X Window配置 20.1 X Window有什么特点 20.2 组成X的基本元素 20.3 X系统的运行原理 20.4 X系统的启动与关闭 20.5 X系统的配置与升级 20.6 X Window的远程管理 20.7 X Window的桌面环境 附录 一、 vi命令汇总表 二、 常用命令列表(描述)可以加入DOS参照 三、 Linux 的技术资源(获取途径、以网上链接为主、Linux社区分类介绍) 四、 GNU通用公共许可证(GPL) 五、 Linux发行版 六、 index(关键词索引)

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧