[原创] 一些未归类的命令、操作方法或问题总结(1)

下面是一些未归类的命令及操作方法,专门记在此文中,以便将来查询。

由于文章较长,请用Ctrl+F查询关键字来定位到你需要的内容。

 

(1)反向域名解析查询

在Windows下用这样的方法来查询域名反解是否做成功了:

ping -a 126.24.23.56

返回结果如果类似于这样:

正在 Ping your.domain.com [126.24.23.56] 具有 32 字节的数据:

来自 126.24.23.56 的回复: 字节=32 时间=56ms TTL=48

来自 126.24.23.56 的回复: 字节=32 时间=56ms TTL=48

来自 126.24.23.56 的回复: 字节=32 时间=56ms TTL=48

则代表域名反解成功了。其中,your.domain.com是你查询的IP所反解的域名,这里只是一个例子。

 

或者用nslookup命令来查询也可以:在命令行下输入nslookup命令,然后输入你要查询的IP再回车,如果输出结果形如:

名称:    your.domain.com

Address:  126.24.23.56

则代表域名反解成功了。

 

Linux下,也可以用nslookup命令来查看域名反解是否成功,用法与Windows下基本一样。

 

(2)STL中的std::numeric_limits<double>::max()函数在VC2005中无法编译通过

这个非常雷人,在include了相关的头文件之后,使用了std::numeric_limits<double>::max()函数的一段非常简单的程序仍然无法编译通过,错误提示大致为:

“max”宏的实参不足……

这个错误是因为windef.h中已经有了一个max宏定义,所以冲突了。为了正常使用std::numeric_limits<double>::max(),要用括号括起来:

(std::numeric_limits<double>::max)()

这样就行了。

 

(3)LINUX下禁止一个用户登录

方法很多,其中一种方法是:

修改 /etc/passwd 文件,找到该用户所在的那一行,将最后的 /bin/bash 改为 /sbin/nologin 即可禁止其登录。

文章来源:http://www.codelast.com/

(4)关闭外网SSH

在LINUX下为了安全,通常需要关闭外网的SSH登录功能,我们可以通过在iptables中添加一条或多条规则,将外网网卡的22端口禁用即可:

修改 /etc/sysconfig/iptables 文件,一般会看到这一句:

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT

它表示接受22端口的TCP连接(默认情况下SSH就是22端口)。

在其上面添加一行:

-A RH-Firewall-1-INPUT -i eth0 -p tcp -m tcp --dport 22 -j REJECT

这表示禁止从eth0网卡进来的22端口的TCP连接。注意,这里认为你的外网网卡是eth0,如果不是的话,请修改成相应的网卡号。

当然,我如果还要允许一个特定的IP地址访问,该怎么办?这时,需要在上面这一句的上面再添加一句:

-A RH-Firewall-1-INPUT -i eth0 -s 126.32.35.129 -p tcp -m tcp --dport 22 -j ACCEPT

这表示允许126.32.35.129这个地址通过eth0的TCP连接,这样做也就使得SSH连接被允许了。

 

(5)Linux系统时间与Internet时间服务器同步(以RHEL为例)

首先你要找到一个提供时间服务的服务器,这里有很多:http://www.pool.ntp.org/en/ 此处我们选择中国的服务器,点击右边的“Asia”,看到了这台服务器地址:cn.pool.ntp.org

然后我们可以在系统中用这条命令来同步:

/usr/sbin/ntpdate cn.pool.ntp.org

但是,执行该命令之后,你可能会看到类似于下面的错误提示:

the NTP socket is in use, exiting

这是因为ntpd服务正在该服务器上运行,你要先停了它:

/etc/init.d/ntpd stop

然后再运行上面的时间同步命令,就会看到类似于下面的输出:

10 Aug 10:03:01 ntpdate[6087]: step time server XXX.XXX.XXX.XXX offset -23.325416 sec

表明同步成功了。然后你再把ntpd服务启动就可以了(/etc/init.d/ntpd start)。

这个时候,假设你要在同一内网的另外的服务器上,以这台刚同步好时间的服务器作为时间源,也可以这样做:

/usr/sbin/ntpdate 192.168.5.5        (假设你刚同步好时间的那台服务器的IP地址为192.168.5.5)

但是,你可能又会看到错误提示:

no server suitable for synchronization found

原因是(来自网上的一段话):“在ntp server上重新启动ntp服务后,ntp server自身或者与其server的同步的需要一个时间段,这个过程可能是5分钟,在这个时间之内在客户端运行ntpdate命令时会产生no server suitable for synchronization found的错误。”

所以,我建议你耐心地等一段时间,再在客户端进行时间同步,问题就没了。

文章来源:http://www.codelast.com/

(6)在Thunderbird邮件客户端中删除重复的邮件

有时候你会收到重复的邮件(例如,接收邮件到一半的过程中断网了,重新联网后可能会接收到重复的邮件),要手工删除它们可能比较麻烦,那么可以用插件来处理,我知道的两个插件是:

Remove Duplicate Messages (Alternate)  和 Remove Duplicate Messages

大家可以一试。

 

(7)ps -ef命令查询进程时,在脚本文件中运行得到的结果和在命令行直接运行得到的结果不同的问题

假设我们有如下两个脚本文件:

slp.sh

#!/bin/sh

sleep 100000000

test.sh

#!/bin/sh

PROCESS_COUNT=`ps -ef | grep $1 | grep -v grep | wc -l`

echo "PROCESS_COUNT : $PROCESS_COUNT"

文章来源:http://www.codelast.com/

脚本①的唯一作用就是消耗时间,用于长时间驻留在内存中。脚本②的作用是:输入一个参数(进程名),查询内存中有几个实例在运行。

为了说明问题,我们先把脚本①以后台方式运行起来:

nohup ./slp.sh &

然后我们再查询一下它是否驻留在内存中了:

ps -ef | grep slp | grep -v grep

输出如下:

root     10049  9196  0 14:07 pts/1    00:00:00 /bin/sh ./slp.sh

可见slp.sh确实驻留在内存中了。并且,此时如果你运行以下命令:

ps -ef | grep slp | grep -v grep | wc -l

得到的输出结果当然是:

1

现在,我们通过test.sh脚本来查询驻留在内存中的slp.sh进程:

./test.sh slp

输出结果竟然是(错误的):

PROCESS_COUNT : 3

你相信吗?事实确实如此。我没想明白为什么,但是我找到了可以使之正确输出结果的办法:使用正则表达式:

./test.sh [s]lp

输出结果为(正确的):

PROCESS_COUNT : 1

另外,如果你提供的是脚本文件的命名(slp.sh),那么就算使用了正则表达式,结果仍然会错误

./test.sh [s]lp.sh

输出结果为错误的):

PROCESS_COUNT : 3

我估计是点号影响了正确的输出,因此,请不要带点号查询进程名。

文章来源:http://www.codelast.com/

(8)在Linux下将一个用户添加到另一个用户组,并且不离开原来的用户组

假设你要将用户sth添加到用户组grp中,则应这样操作:

usermod -a -G grp sth

其中,-a是append的意思,也就是将用户添加到用户组中,而不会离开其他用户组。 

 

(9)Linux下用shell来统计网络连接数(来自网上)

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

或者:

netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'

输出形如:

TIME_WAIT        766

FIN_WAIT1        124

FIN_WAIT2        37

ESTABLISHED      215

SYN_RECV         508

CLOSING          198

LAST_ACK         23

 

(10)”rpm: error while loading shared libraries: libelf.so.1: cannot open shared object file: No such file or directory“错误的解决

突然之间,发现rpm命令不能用了,原来是自己强制卸载了一个包导致的(rpm -e --nodeps elfutils-libelf-0.125-3.el5),悔不当初啊。

然后,rpm命令不能用,使得所有rpm包都无法安装了,于是只能修复这个错误,需要下载安装libelf库,我这里下载到的是libelf-0.8.13.tar.gz,在这里找到的。解压出来之后configure、make、make install,便可安装完成。但是你再运行rpm命令,还是一样报错,因为rpm命令会在某个系统目录下寻找libelf.so.1,找不到当然报错,于是我手工创建了一堆的软链接:

ln -s /usr/local/lib/libelf.so.0.8.13 /usr/local/lib/libelf.so.1

ln -s /usr/local/lib/libelf.so.0.8.13 /usr/local/lib64/libelf.so.1

ln -s /usr/local/lib/libelf.so.0.8.13 /usr/local/share/

ln -s /usr/local/lib/libelf.so.0.8.13 /usr/lib64/libelf.so.1

ln -s /usr/local/lib/libelf.so.0.8.13 /usr/lib/libelf.so.1

这回彻底清静了,rpm又回来了。然后我又安装了一堆rpm包(与解决上面的问题没有关系。这些包可能是循环依赖的,因此一口气安装):

rpm -ivh --replacepkgs elfutils-0.137-3.el5.x86_64.rpm elfutils-devel-0.137-3.el5.x86_64.rpm elfutils-devel-static-0.137-3.el5.x86_64.rpm elfutils-libelf-0.137-3.el5.x86_64.rpm elfutils-libelf-devel-0.137-3.el5.x86_64.rpm elfutils-libelf-devel-static-0.137-3.el5.x86_64.rpm elfutils-libs-0.137-3.el5.x86_64.rpm

文章来源:http://www.codelast.com/

(11)RHEL 5.3(Linux version 2.6.18-53.el5)下安装systemtap

RHEL 5.3里无法使用latencytop,只能用systemtap软件自带的latencytap.stp来代替,系统里自带的systemtap版本很老,没有latencytap.stp:

[root@localhost src]# stap -V

SystemTap translator/driver (version 0.7.2/0.137 non-git sources)

下载新版的源码压缩包,解压出来,./configure 提示错误:

configure: error: missing elfutils development headers/libraries (install elfutils-devel, libebl-dev, libdw-dev and/or libebl-devel)

可见,提示要安装elfutils-devel、libebl-dev和libdw-dev。除了elfutils-devel之外,RHEL 5.3自带的安装光盘里竟然没有其他几个包,这还不算,然后到这个网站去找所需的rpm包,分别安装的时候,又提示依赖于其他的包,包包依赖无极限,发现没有个尽头:

[root@localhost systemtap]# rpm -ivh libdw-devel-0.137-3.17.x86_64.rpm libebl-devel-0.137-3.17.x86_64.rpm libdw1-0.137-3.17.x86_64.rpm libebl1-0.137-3.17.x86_64.rpm

warning: libdw-devel-0.137-3.17.x86_64.rpm: Header V3 RSA/SHA256 signature: NOKEY, key ID 3dbdc284

error: Failed dependencies:

        libelf-devel = 0.137 is needed by libdw-devel-0.137-3.17.x86_64

        rpmlib(PayloadIsLzma) <= 4.4.2-1 is needed by libdw-devel-0.137-3.17.x86_64

        rpmlib(PayloadIsLzma) <= 4.4.2-1 is needed by libebl-devel-0.137-3.17.x86_64

        libc.so.6(GLIBC_2.8)(64bit) is needed by libdw1-0.137-3.17.x86_64

        rpmlib(PayloadIsLzma) <= 4.4.2-1 is needed by libdw1-0.137-3.17.x86_64

        rpmlib(PayloadIsLzma) <= 4.4.2-1 is needed by libebl1-0.137-3.17.x86_64

如果只安装elfutils-devel,那么的确是可以成功地configure,但是无法成功make:

dwflpp.cxx: In member function 'void dwflpp::iterate_over_libraries(void (*)(void*, const char*), base_query*)':

dwflpp.cxx:1062: error: 'elf_getphdrnum' was not declared in this scope

make[2]: *** [stap-dwflpp.o] Error 1

很明显,找不到elf_getphdrnum函数定义,看来是某个库没装,可能就是前面configure时提示的libebl-dev和libdw-dev。

这问题暂时未解决,郁闷啊。

文章来源:http://www.codelast.com/

(12)rz命令上传文件时默认并不会覆盖已经存在的同名文件

在SecureCRT等终端软件里使用 rz 命令上传文件到Linux主机中,默认是不会覆盖上传目录里已经存在的同名文件的,rz -y 才会覆盖上传,千万注意。不要以为上传一定会覆盖,从而引出大问题。

 

(13)比较文本文件内容差异

在Linux下用diff命令(diff fileA fileB),在Windows下可以用N多图形化的工具,相当直观,举几个例子:

A、安装Visual Studio 2005时自带的WinDiff.exe工具(通常位于VS安装目录下的 Common7\Tools\Bin\ 目录下)

B、免费的DiffMerge软件,经试验相当好用,强烈推荐。

 

(14)shell判断字符串是否为空

STR=""

if [ "$STR" ]; then   

    echo "NOT NULL"

else

    echo "NULL"

fi

不用像网上说 的一样,用 -n 或 -z 来判断那么麻烦(当然那样也可以)。具体可以man test

文章来源:http://www.codelast.com/

(15)使基于CHtmlView的程序访问某一页面时不弹出各种窗口(VC++ 2005)

重载OnNewWindow2函数,函数内容如下:

void CXXXView::OnNewWindow2(LPDISPATCH* ppDisp, BOOL* Cancel)

{

      // TODO: 在此添加专用代码和/或调用基类

      *ppDisp = this-> GetApplication();

      *Cancel = FALSE;

      //CHtmlView::OnNewWindow2(ppDisp, Cancel);    // 原来的,注释掉

}

 

(16)打开RHEL的内核日志(kernel.log)记录功能

修改文件/etc/syslog.conf,添加这一句:

kern.*                                                 /var/log/kernel.log

然后重启服务:

/etc/init.d/syslog restart

再看看内核日志文件是否生成了:

ll /var/log/kernel.log

 

(17)在Windows下,用7-Zip的命令行工具7za解压tar.gz文件,并且一步完成

7za是7-Zip的命令行工具,如果你以这样的方式解压一个*.tar.gz文件:

7za.exe e file.tar.gz

则解压出来的是tar文件 file.tar,而不是最里面一层的文件/文件夹。要一步完成解压,可以这样:

7za.exe e file.tar.gz && 7za.exe x file.tar

然后就会发现全部解压出来了,不过这个时候,解压的目标目录下会多出一个tar文件,需要你自己删掉。

文章来源:http://www.codelast.com/

(18)字符串拷贝的_tcscpy

想用strcpy()来拷贝字符串?为了程序的兼容性,最好用_tcscpy(),因为该函数在UNICODE下被替换为wcscpy,在非UNICODE下被替换为strcpy。

 

(19)在Win7下用VS2008编译一个VC工程时遇到“LINK : fatal error LNK1000: Internal error during IncrBuildImage”错误

不用多想,这是VS 2008的bug。赶快看看你的VS有没有安装VS 2008 SP1,如果没有,赶紧装上吧。

 

(20)在Windows下用regsvr32.exe注册(安装)/反注册(卸载)一个ATL控件

注册(安装):

regsvr32.exe E:\your_control.dll

反注册(卸载):

regsvr32.exe /u E:\your_control.dll

 

(21)调试ATL时指定了错误的可执行文件名称,再次按F5运行时提示找不到程序的问题

VS2008,假设用Visual C++编写一个ATL控件(DLL),按F5编译执行,如果成功的话,会弹出一个对话框:

ATL Debug 1

假设我们用IE来调试,那么,你需要在“可执行文件名称”框内填写IE程序名,但是你写错了,写成了XXX,则会提示“未找到XXX。是否要选择其他文件?您可能需要输入完整路径。”

此时,如果你选择的是“否”,那么就会弹出另一个错误提示:“无法启动程序XXX,系统找不到指定的文件”。

这个时候,你再次按F5编译执行的话,系统不会让你再次选择程序了,会直接使用你上次填写的XXX程序名,从而导致依然找不到程序,那么如何改掉它呢?

在VS 2008的菜单中:“项目”→“AAA 属性”中(其中,AAA为你的工程名),可以修改掉这个被自动填进去的程序名,

如下图所示:

ATL Debug 2

文章来源:http://www.codelast.com/

将其删除,再点击“确定”,就又回到原始状态了。

文章来源:http://www.codelast.com/

(22)重载函数时提示“无法执行添加/移除操作,因为代码元素是只读的”

在VS 2005中,用属性窗口中的“重写功能”来重载一个MFC类的函数的时候,提示错误“无法执行添加/移除操作,因为代码元素是只读的”。

该错误产生的原因有很多种,我这里没有遇到那么多种,只是遇到了其中的一种,其解决方法也非常搞笑:关闭工程中已经打开的该类的.h和.cpp文件,然后再操作,就OK了。

有时候这些匪夷所思的问题及解决办法很让人摸不着头脑,只能一点点地积累,习惯就好。

 

(23)CString转std::wstring,CString转WCHAR,Unicode CString 转 ANSI string,char* 转 std::wstring

CString转std::wstring:

CString str;

std::wstring wstr = str.GetString();

 

CString转WCHAR数组(需要#include <atlconv.h>):

CString str = _T("This are some words.");

WCHAR *pText = new WCHAR[str.GetLength()];

USES_CONVERSION;

wcscpy(pText, CT2CW(str));

(后面省略……)

 

Unicode CString 转 ANSI string:

首先要:#include <atlconv.h>

然后就可以用了:

CString strUnicode = _T(“abcdefg”);

USES_CONVERSION;

std::string strSrc = T2A((LPTSTR)(LPCTSTR)strUnicode); // Unicode CString 转 ANSI string 

 

char* 转 std::wstring:

首先要:#include <atlconv.h>

然后就可以用了:

USES_CONVERSION;

char szSrc[32] = "test";

std::wstring strW(A2W(szSrc));

 

(24)Linux控制台打印出“set_rtc_mmss can't update from 59 to XXX”错误提示

这是你的系统时间与CMOS时间差大于30分钟导致的,你需要修改你的系统时间,最好是搭建一个ntp时间同步服务来解决。

 

(25)如何使Linux用户sudo执行命令时无需输入密码 & 允许sudo命令在后台执行

修改 /etc/sudoers 文件(或者直接用visudo命令,也是直接打开此文件),找到下面的这两行注释:

## Same thing without a password

# %wheel        ALL=(ALL)       NOPASSWD: ALL

在这两行注释下方添加一行:

abc        ALL=(ALL)       NOPASSWD: ALL

这样,你的abc用户就可以无需密码直接sudo执行命令了。

但是,默认情况下,sudo是不能在后台执行的,不信你用crontab执行一个含有sudo命令的脚本,并将输出重定向(例如 /usr/bin/myshell.sh >> /tmp/output.txt 2>&1)到一个文件中,会看到如下的内容:

sudo: sorry, you must have a tty to run sudo

所以,为了实现允许sudo命令在后台执行,你还是要修改/etc/sudoers 文件,将这一句注释掉:

Defaults    requiretty

这一句的意思就是:默认是需要有TTY才能运行sudo命令。注释掉就可以解决问题了。

文章来源:http://www.codelast.com/

(26)错误:fatal error C1853: “Debug\XXX.pch”预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)

在VS2005中出现这个编译错误,是因为项目中的C和C++文件混合编译引起的(编译器对它们采取不同的编译方式)。要解决这个问题,可以将C文件属性中的“使用预编译头”设置为“不使用预编译头”即可。

(27)Linux下如何查看端口占用情况(某个端口是被哪个进程占用的)

[root@localhost] ~$ netstat -tunlp | grep 29285
tcp        0      0 0.0.0.0:29285               0.0.0.0:*                   LISTEN      24304/java

如上所示,我想查询29285端口是被哪个进程占用的,就得到了上面的结果,最后一列的结果表明,该端口是被PID为24304的进程占用的。
下面,再用ps命令查询该进程的具体路径:

ps -ef | grep 24304

就得到了想要的答案。

文章来源:https://www.codelast.com/
➤➤ 版权声明 ➤➤ 
转载需注明出处:codelast.com 
感谢关注我的微信公众号(微信扫一扫):

wechat qrcode of codelast

发表评论