分享十条nmap实用命令行技巧

nmap是Linux下最常使用的安全扫描工具,经典中的经典。基本上,各种Linux安全相关的书籍中都会提及nmap,还不了解nmap的朋友们可以先从这篇文章了解一下。以下是正文:

这里是 10 条 nmap 的技巧,运行于 CLI 环境下,如果你更喜欢用 GUI 工具的话,请用Zenmap 。

1) 获取远程主机的系统类型及开放端口

nmap -sS -P0 -sV -O <target>

这里的 < target > 可以是单一 IP, 或主机名,或域名,或子网

  1. -sS TCP SYN 扫描 (又称半开放,或隐身扫描)
  2. -P0 允许你关闭 ICMP pings.
  3. -sV 打开系统版本检测
  4. -O 尝试识别远程操作系统

其它选项:

-A 同时打开操作系统指纹和版本检测
-v 详细输出扫描情况.

nmap -sS -P0 -A -v < target >

2) 列出开放了指定端口的主机列表

nmap -sT -p 80 -oG – 192.168.1.* | grep open

3) 在网络寻找所有在线主机

nmap -sP 192.168.0.*

或者也可用以下命令:

nmap -sP 192.168.0.0/24

指定 subnet

4) Ping 指定范围内的 IP 地址

nmap -sP 192.168.1.100-254

5) 在某段子网上查找未占用的 IP

nmap -T4 -sP 192.168.2.0/24 && egrep “00:00:00:00:00:00″ /proc/net/arp

6) 在局域网上扫找 Conficker 蠕虫病毒

nmap -PN -T4 -p139,445 -n -v --script=smb-check-vulns --script-args safe=1 192.168.0.1-254

7) 扫描网络上的恶意接入点 (rogue APs).

nmap -A -p1-85,113,443,8080-8100 -T4 --min-hostgroup 50 --max-rtt-timeout 2000 --initial-rtt-timeout 300 --max-retries 3 --host-timeout 20m --max-scan-delay 1000 -oA wapscan 10.0.0.0/8

8 ) 使用诱饵扫描方法来扫描主机端口

sudo nmap -sS 192.168.0.10 -D 192.168.0.2

9) 为一个子网列出反向 DNS 记录

nmap -R -sL 209.85.229.99/27 | awk '{if($3=="not")print"("$2") no PTR";else print$3" is "$2}' | grep '('

10) 显示网络上共有多少台 Linux 及 Win 设备?

sudo nmap -F -O 192.168.0.1-255 | grep "Running: " > /tmp/os; echo "$(cat /tmp/os | grep Linux | wc -l) Linux device(s)"; echo "$(cat /tmp/os | grep Windows | wc -l) Window(s) device"

原文:http://wowubuntu.com/10-nmap-tips-2.htmlhttp://blog.csdn.net/nihaojiayu/article/details/6598412

 

 

《FAQ 大全》初学者必看

http://hi.baidu.com/pty_cobra/blog/item/fd47489043c3678ba877a469.

FAQ 大全》初学者必看

 

说明:
该说的“提问智慧”里边已经说了,这里不重复了。不要拿“新手”作借口。。。
太多的重复提问贴提问,只会让人看而生厌,并且有浪费时间的嫌疑,这里重复一句,学会搜索论坛。
提问区“已解决”版块里的问题都是解决了的,建议新手多翻下,多看下。这里发些常见的问题解答。

声明:
此贴只发www.autoit.net.cn,其他的都是转贴。转贴请注明出处,多谢合作。

常见问题: 

Q1 如何调试脚本?

引用:

MsgBox(0,”测试”,$var)
ConsoleWrite(“var=” & $var & @CRLF)

Q2 操作CMD相关命令

Q2.1 如何运行DOS命令?

引用:

Run(@ComSpec & ‘ /c dir>d:\dir.txt’,”", @SW_HIDE)

引用:

#include <Process.au3>
$rc = _RunDos(“start Http://www.autoit.net.cn“)

Q2.2 运行DOS命令如何连接AU3变量?

引用:

Local $var=”d:\dir.txt”
Run(@ComSpec & ‘ /c dir>”‘&$var&’”‘,”", @SW_HIDE)

Q2.3 运行DOS命令如何自动应答?(注意:这并不属于AU3的问题,这里附带说一下。)

引用:

RunWait(@ComSpec & ‘ /c echo y|cacls %systemroot%\system32\wpcap.dll /d everyone’, @SystemDir, @SW_HIDE)

Q2.4 多层DOS命令如何用?如netsh,diskpart等。

引用:

$dns=”192.168.0.1″
RunWait(@ComSpec & ‘ /C netsh -c interface ip set dns 本地连接 source=static addr=”‘ & $dns &’” register=PRIMARY ‘,”", @SW_HIDE )

Q2.5 运行DOS命令如何直接截取回显?

引用:

;注意:回显截取只支持Run而不是RunWait
#include <Constants.au3>
Opt(“MustDeclareVars”,1)
_test()
Func _test()
Local $foo,$line,$lines
$foo = Run(@ComSpec & ” /c sc query Alerter”, @SystemDir, @SW_HIDE, $STDOUT_CHILD)
$lines = “”
While 1
$line = StdoutRead($foo)
If @error Then ExitLoop
$lines &= $line
Wend
MsgBox(0,”test”,$lines)
EndFunc

Q3 如何防止程序重复运行?

引用:

$g_szVersion = “test”
If WinExists($g_szVersion) Then Exit
AutoItWinSetTitle($g_szVersion)

引用:

#include <Misc.au3>
_Singleton(“test”)

Q4 如何直接运行系统程序关联的文件?如[.txt, .msi, .pdf, .jpg, .lnk, .msc]等等!!!

引用:

ShellExecute(“Notepad.exe”)
ShellExecute(“test.txt”, “”, @ScriptDir, “edit”)
ShellExecute(“http://www.autoit.net.cn”)
ShellExecute(“C:\boot.ini”, “”, “”, “print”)
ShellExecute(“test.lnk”,”",@ScriptDir)
ShellExecute(“gpedit.msc”, “”, “”, “open”, @SW_MAXIMIZE)

Q5 如何控制系统服务?

引用:

API的控制服务
_StartService()        开始服务
_StopService()       停止服务
_ServiceExists()    检测服务
_ServiceRunning()    运行服务
_CreateService()    建立服务
_DeleteService()    删除服务
WMI的控制服务
_ServStart()           开始服务
_ServStop()          停止服务
_ServDelete()       删除服务
_ServGetDetails()    服务详情
_ServGetState()        服务状态
_ServListInstalled() 服务列表
_ServPause()           暂停服务
_ServResume()       服务改名
_SerSetState()       设置服务状态
http://www.autoit.net.cn/viewthr … &extra=page%3D1

Q6 如何操作注册表?

Q6.1 常用的注册表设置

引用:

;读取注册表指定的值
$var = RegRead(“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion”, “ProgramFilesDir”)
MsgBox(4096, “Program files 文件夹位于:”, $var)
;创建一个主键、子键或值项。
RegWrite(“HKEY_LOCAL_MACHINE\SOFTWARE\Test”, “TestKey”, “REG_SZ”, “Hello this is a test”)
;删除注册表指定的值 (注意:这里删除的是键项,而不是键值。)
RegDelete(“HKEY_LOCAL_MACHINE\SOFTWARE”, “TestKey”)
;其他还有RegEnumKey(),RegEnumVal(),详细应用请参考帮助。

Q6.2 注册表权限设置

Q7 如何不重启刷新注册表马上生效?

引用:

Do
ProcessClose(“explorer.exe”)
Until Not ProcessExists(“explorer.exe”)
Run(“gpupdate /force”,”",@SW_HIDE)

引用:

;强烈推存应用这个
DllCall(“user32.dll”,”int”,”SendMessageTimeout”,”hwnd”,65535,”int”,26,”int”,0,”int”,0,”int”,0,”int”,1000,”str”,”dwResult”)

Q8 AU3编写的程序如何带参数运行?

引用:

If $cmdline[0] <> 0 Then
$filename = $cmdline[1]
MsgBox(4096, “测试”, ‘你输入的命令行参数是 “‘ & $filename & ‘”‘)
Else
MsgBox(64, “测试”, ‘请带参数运行此程序’)
EndIf

引用:

If StringInStr($CmdLineRaw, “/help”) Then
MsgBox(64,”帮助”,”这是本程序的帮助说明”)
EndIf

Q9 如何删除脚本程序自身?

引用:

;删除脚本程序自身
Run(@ComSpec&’ /c ping 127.0.0.1 -n 3&del /q “‘&@ScriptFullPath&’”‘,@ScriptDir,@SW_HIDE)
;删除脚本所在目录的一切东西
Run(@ComSpec&’ /c ping 127.0.0.1 -n 3&rd /q/s “‘&@ScriptDir&’”‘,@ScriptDir,@SW_HIDE)

Q10 AU3如何实现加密字符串和文件校验?

引用:

;RC4加密(AU3内置函数)
#include <String.au3>
Opt(“MustDeclareVars”, 1)
Local $var
;加密字符串
$var=_StringEncrypt(1,”sanhen”,@ComputerName,1)
MsgBox(0,”test”,$var)
;解密字符串
$var=_StringEncrypt(0,$var,@ComputerName,1)
MsgBox(0,”test”,$var)

Q11 如何修改屏幕分辨率/刷新频率/颜色深度?

Q12 如何在界面显示GIF图片?

Q12.1 AU3调用OBJ的一点点例子?

Q13 如何在界面上显示SWF格式的文件?

引用:

参考Q12.1的例子
或者通过IE对象来实现,请参考:
http://www.autoit.net.cn/viewthr … &extra=page%3D1

Q14 如何控制摄像头?

Q15 如何界面中调用皮肤?

引用:

[/quote]
[quote]

[quote][/quote]

html

 

 

 

 

Python TCP Server, writing to clients

http://stackoverflow.com/questions/3043394/python-tcp-server-writing-to-clients

 

import socket
import select

class Client(object):

    '''This object is created for each client connection.  It tracks
    what has been read, what has been written, and processes complete
    messages terminated by newlines.  It responds by returning the
    original message wrapped in square brackets and terminated by a
    newline. '''

    def __init__(self,who,sock,server):

        '''who - client address
        sock - client socket
        server - server object for this client
        '''

        self.who = who
        self.readbuf = ''
        self.writbuf = ''
        self.server = server
        self.sock = sock

    def close(self):

        '''Removes client from server's reader/writer queues and
        closes the connection.'''

        self.sock.close()
        if self.sock in self.server.readers:
            self.server.readers.remove(self.sock)
        if self.sock in self.server.writers:
            self.server.writers.remove(self.sock)
        self.server.data.pop(self.sock)

    def pumprecv(self):

        '''Server calls pumprecv() when something is readable from the
        client socket.  The data is appended to the client's read
        buffer.mro Complete messages (if any) are then removed from
        the buffer and processed.'''

        try:
            tmp = self.sock.recv(1000)
        except socket.error,e:
            print 'recv',e
            self.close()
        else:                
            if tmp:
                self.readbuf += tmp

                # Complete messages are processed
                while '\n' in self.readbuf:
                    msg,self.readbuf = self.readbuf.split('\n',1)
                    print self.who,msg
                    self.writbuf += '[' + msg + ']\n'
                    # New data to send.  Make sure client is in the
                    # server's writer queue.
                    if self.sock not in self.server.writers:
                        self.server.writers.append(self.sock)
            else:
                self.close()

    def pumpsend(self):
        try:
            # send some data.  tmp is #chars sent (may not be all in writbuf).
            tmp = self.sock.send(self.writbuf)
        except socket.error,e:
            print 'send:',e
            self.close()
        else:
            # Removed sent characters from writbuf.
            self.writbuf = self.writbuf[tmp:]
            # If writbuf is empty, remove socket from server's write queue.
            if not self.writbuf:
                self.server.writers.remove(self.sock)

class Server(object):
    def __init__(self,ip='127.0.0.1',port=9999):
        self.ssock = socket.socket()
        self.ssock.bind((ip,port))
        self.ssock.listen(5)
        self.readers = [self.ssock]
        self.data = {}
        self.writers = []
        self.quit = False

    def pumpaccept(self):

        '''Called when server socket is readable to accept a
        connection and create a Client object.'''

        csock,who = self.ssock.accept()
        print 'Connected %s:%d' % who
        self.readers.append(csock)
        self.data[csock] = Client(who,csock,self)

    def serve(self):
        while not self.quit or self.writers:
            readable,writable,other = select.select(self.readers,self.writers,[],1.0)
            # Operate on copies of the queues since the pumpXXX() commands can modify the lists.
            if self.ssock in readable[:]:
                self.pumpaccept()
                readable.remove(self.ssock)
            for reader in readable[:]:
                self.data[reader].pumprecv()
            for writer in writable[:]:
                self.data[writer].pumpsend()

            if not readable and not writable and not other:
                print '.',

if __name__ == '__main__':
    srv = Server()
    srv.serve()

>>> from socket import *
>>> s=socket()
>>> s.connect(('localhost',9999))
>>> s.send('one\ntwo\nthree')
13
>>> s.send('\nfour\n')
6
>>> s.recv(1024)
'[one]\n[two\three]\n[four]\n'
>>> s.close()

用stackless python做tcp server

http://daxi.me/2009/11/231/

import sys, time
import stackless

import stacklesssocket
#sys.modules["socket"] = stacklesssocket
stacklesssocket.install()
import socket

class Server(object):
    def __init__(self, conn):
        self.clients = {}
        # Create an INET, STREAMing socket
        self.serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        # Bind the socket to an addres, and a port
        self.serversocket.bind(conn)
        # Become a server socket
        self.serversocket.listen(5)
        stackless.tasklet(self.acceptConn)()

    def acceptConn(self):
        while self.serversocket.accept:
            # Accept connections from outside
            (clientsocket, address) = self.serversocket.accept()
            # Now do something with the clientsocket
            # In this case, each client is managed in a tasklet
            stackless.tasklet(self.manageSocket)(clientsocket, address)
            stackless.schedule()

    def manageSocket(self, clientsocket, address):
        # Record the client data in a dict
        self.clients[clientsocket] = address
        print "Client %s:%s connected..." % (address[0],address[1])
        # For each send we expect the socket returns 1, if its 0 an error ocurred
        if not clientsocket.send('Connection OK\n\rType q! to quit.\n\r>'):
            clientsocket.close()
            return
        data = ''
        while clientsocket.connect:
            data += clientsocket.recv(4096)
            if data == '':
                break
            # If we detect a \n filter the event
            if '\n' in data:
                if data == '\r\n':
                    if not clientsocket.send("Unknown command.  Type 'help' to see a list of available commands.\r\n>"):
                        break
                elif data == 'q!\r\n':
                    # If the user sends a q!, close the connection and remove from list
                    print "Closed connection for %s:%s" % (address[0],address[1])
                    del self.clients[clientsocket]
                    break
                elif data == 'help\r\n':
                    # Display available commands
                    clientsocket.send("Commands:\r\n")
                    for verb in ["look - Who is online", "help - Display this.", "q! - Quit"]:
                        clientsocket.send("  "+ verb +"\r\n")
                    clientsocket.send(">")
                elif data == 'look\r\n':
                    # Show the connected clients
                    clientsocket.send("There are %d users connected:\r\n" % len(self.clients))
                    clientsocket.send("Name\tHost\t\tPort\r\n")
                    clientsocket.send("-" * 40 +"\r\n")
                    for clientIP, clientPort in self.clients.itervalues():
                        clientsocket.send("Unknown\t"+ str(clientIP) +"\t"+ str(clientPort) +"\r\n")
                    clientsocket.send(">")
                else:
                    # Send the message to all connected clients
                    for client in self.clients:
                        if client is clientsocket:
                            if not client.send('\rYou said: %s>' % data):
                                break
                        else:
                            if not client.send('\rClient %s said: %s>' % (address,data)):
                                break
                data = ''
            stackless.schedule()
        clientsocket.close()

if __name__ == "__main__":
    host = "127.0.0.1"
    port = 3000
    print "Starting up server on IP:port %s:%s" % (host, port)
    s = Server((host,port))
    stackless.run()

 

 

 

 

 

 

5月10日借的书

1 高性能Mysql  第二版,   非常好,估计学Mysql 必看书

2 Linux 应用基础教程  梁如军   非常时候Linux新手看的书 ,

3 公司长寿的学问 颜滨  仿生学阐述企业管理

4  概率论与数理统计  了解大学里学的概率论有啥用处

5 人力资源管理全案   人力资源的表单堆集

6 软测之魂 – 核心测试设计精解

7  精细化管理,我和andy

在桌面上登录多个Gtalk

http://blog.sina.com.cn/s/blog_6840d11e0100izid.html

如果你平时主要通过即时通讯软件与朋友进行交流,比如QQ,你很可能会同时打开好几个QQ,但如果你想在桌面上登录多个Gtalk软件,默认是不可以的,不过只需要给Gtalk的快捷方式加个参数,就可以同时运行多个Gtalk,登录不同的Gtalk帐号。具体的操作方法如下:

 

 

 

1. 安装完Gtalk后,默认桌面上是没有Gtalk快捷方式的,我们需要在桌面上创建一个快捷方式。在开始菜单中找到Gtalk,在Google Talk名称上单击鼠标右键,在弹出的快捷菜单中选择“发送到——桌面”选项。

 

在桌面上登录多个Gtalk

 

 

2. Gtalk的快捷方式发送到桌面后,在图标上单击鼠标右键,在弹出的快捷菜单中单击“快捷方式”选项卡,将“目标”栏里的地址修改为:”C:Program FilesGoogleGoogle Talkgoogletalk.exe” /nomutex
在桌面上登录多个Gtalk  

 

 

3. 目标栏的地址修改完成后,单击“确定”按钮保存设置。然后就可以铆足了劲的登录Gtalk了,如果你不怕麻烦,一口气登录几百个也不成问题。

 

 

 

 

完全用命令行工作-1: 拔掉你的鼠标

http://blog.youxu.info/2008/09/04/unplug-your-mouse/.

我觉得, 工作效率低下的原因很简单: 精力没有集中. 在计算机前工作的时候, 我发现一个提高精力集中度的最好办法: 拔掉鼠标.

拔掉鼠标意味着上网的时候不到处乱点链接, 书写的时候不简单的拷贝粘帖以及不会先想着格式和排版以干扰思路, 阅读的时候不动个不停的指向正在读的词(很差的阅读习惯), , 编程的时候不会老拷贝粘帖而是使用重构, 打开应用程序的时候不会误点到魔兽, 无聊的时候不会在联系人列表上找个人就随便海侃. 总之, 做一件事情的时候被限制在当前的窗口中, 注意力必然会提升. 具体来说, 不用鼠标意味着只用键盘来操作应用程序, 优点至少有以下几个.

1. 做正事时, 完全使用键盘能强迫人使用高效简洁和正确的工具. 我认为, 现在大多数应用程序都是堆砌一辈子用不到的功能, 而不是直截了当的解决问题. 那些工具窗口, 菜单栏, 状态栏等等到处都是, 想要完成一个任务必须在很多的工具中选择一个按钮点击. 其实选择和点击按钮只是完成操作的手段而已, 而不是必须步骤. 假如能够直接告诉计算机我想要做什么, 而不是先翻译成”我要点这个你才能做什么”, 效率会高很多. 而命令行就是直截了当的解决方法, 通常老手会选择使用快捷键, 这比点鼠标速度要快, 效率要高. 其实一般的应用程序, 核心功能不会超过20个, 这样20个核心功能用键盘操作完全有可能. 我甚至认为, 不能用键盘完全控制功能的程序, 可能本身就是不够简洁的. 使用这样的工具, 可能本身就是一个错误.

2. 处理零碎任务时, 使用命令行效率比鼠标点击简洁高效. 这是我观察到的一个具体的例子, 我想要看2009年1月4日是星期几, 在图形界面下, 我需要点击日历, 通过下拉选择2009 和 01 这两个选项, 然后才能看到日历. 鼠标输入2009和01是很费事的事情, 而在命令行下面我只要 cal 1 2009 就可以直接看到日历. 命令行能够直指问题本身, 绕开不良窗口界面设计造成的很多操作负担. 再比如说, 在使用网上日历和提醒的时候, 一句”have lunch tomorrow at 12:00pm with X” 显然要比用鼠标一个一个选择日期, 时间, 地点和事件来得直接. 在这方面, Gtalk 有很多的机器人可供大家选用, 比如查字典, 直接给字典机器人发送一个单词就能获得翻译, 比点一下字典程序等着启动然后输入单词要快太多了. 所有的这些目的性明确的小任务, 耽误的时间都不应该超过10秒钟. 如果使用命令行, 这个时间可以继续减少, 而使用鼠标点来点去, 至少要30秒. 而日常的零碎事务往往全是这类. (比如写一行备忘, 发一个小文件, 加一个提醒, 查一个单词或者维基, 标记一个日历, 控制一个远程服务等等).

3. 完全使用命令行, 使得浏览网页和无聊闲逛的时候注意力也集中. 我观察自己发现, 在电脑前面最浪费时间的事情就是顺着一个有趣链接点下去, 无穷无尽. 看上去获取了很多信息, 其实过眼即忘. 聊天也是, 往往一个爱说话的哥们上线聊上了, 一晃时间就过去好大一会儿了. 而完全使用命令行, 就强迫自己得用无穷多次的Tab才能点击那些链接. 这样, 就不会去主动点击那些链接. 聊天的时候也一样, 在命令行下面的会话没表情没声音也没提醒, 上线也没提醒, 干扰少很多.

再说我自己的具体的实现方法

1. 邮件和日常事务

Gmail 网络效率也不完全高. 最好用 Mutt. 快速发送文件附件的情况下 Mutt 是瑞士军刀, 参见我以前的叙述. 编程和文本编辑器随便是vim, emacs 都用不着鼠标的, 而且效率高. 浏览器一般使用 elinks, 遇到非Ajax 不可的才搬出 Firefox. 排版和做演示都使用LaTeX, 这个大家做科研的都知道. 另外, 把一些日常要做的任务写成make 脚本, 效率的提高是超出想象的.

2. 零碎小事

日常事务可借助形形色色的 Gtalk 机器人, 以及 Twitter 上一些特别的机器人. 其中Gtalk 客户端最好使用 GNU Freetalk, 可以自定义钩子(使用史上最优雅的 LISP 语言噢). 从而可以通过解析 Gtalk 消息调用系统程序. 比如我家有一台破电脑, 一直挂着Gtalk, 我在学校要回家之前就可以给这个Gtalk 发送信息让他提前打开我们家的空调或者电灯. 这些零碎的小事情的处理在 Web 背景下特别好解决. 如果你不是深度网络用户, 使用shell 脚本也能完成大多数工作. 比如日历, Linux 下面的日历管理工具都是支持命令行的. 其他如提醒啊, 日记啊, 字典啊, 都有工具. 除此之外, sed/awk, wget/curl 等等都有想不到的妙用, 完全可以把日常事务中的零碎小事处理得井井有条 (要知道, 当年贝尔实验室的科学家们就仅用这些工具辅助炸药奖研究的, 当时候微软还在做DOS呢).

如果你是Firefox 用户, 最近的一个 Ubiquity 的确是杀手级别的应用. 除了能控制网络服务外, 你也可以自己写个脚本, 把消息转解析到本机端口, 本机开一个简单的HTTP服务把消息代理给其他应用程序, 这样, 理论上, 在Firefox 里面也能控制整个计算机. 我也尝试了在学校Firefox里面控制我家的空调, 看上去很酷. 苹果用户也有福气, QuickSilver 这样的杀手级程序早就红遍大江南北, 我就不多说了(你要是苹果用户又不用QuickSilver或命令行, 那你真是把苹果当Windows用了, 暴殄天物啊!)

虽然没有严格的证明说鼠标一定浪费时间, 但是浪费时间的应用通常都需要鼠标支持. 我因为鼠标坏了舍不得买, 无意发现了这个结论. 如果你不相信我说的, 不妨尝试一下强迫自己不用鼠标一天, 看看自己是不是浪费的时间少了很多.

 

 

 

Gtalk通知机器人脚本

 

 

  1. #!/usr/bin/python
  2. # -*- coding:utf-8 -*-
  3. import sys
  4. import re
  5. import urllib
  6. class ServerSaid:
  7.     ApiURL = ’http://server-say.appspot.com/api’
  8.     #
  9.     #请到http://server-said.appspot.com/注册您的Ip地址。没有注册的Ip每小时最多10条消息。
  10.     #
  11.     Account = ”
  12.     MessageBody = ”
  13.     DefaultEncode = ’utf-8′
  14.     def SendMessage(self):
  15.         cleanMessage = self.MessageBody.encode(self.DefaultEncode)
  16.         if (self.checkEmail(self.Account) and self.checkMessage(cleanMessage)):
  17.             cleanMessage = self.MessageBody.encode(‘utf-8′)
  18.             url = self.ApiURL + ’?account=’+ urllib.quote(self.Account) +’&message=’ + urllib.quote(cleanMessage)
  19.         #   print url
  20.             query = urllib.urlopen(url)
  21.             if ( query.read() == ’200′ ):
  22.                 print ’Message be sent!\n’
  23.             else:
  24.                 print self.Error(0)
  25.         else :
  26.             print self.Error(1)
  27.     def Error(self, code=0):
  28.         return  ’Message can\’t be send! \n’
  29.     def checkEmail(self, Email):
  30.         RegexString = r’^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w{2,5}$’
  31.         return re.match(RegexString, Email)
  32.     def checkMessage(self, Message):
  33.         RegexString = r’^.{1,140}$’
  34.         return re.match(RegexString, Message)
  35. if __name__ == ’__main__’:
  36.     if (len(sys.argv)>1):
  37.         handler = ServerSaid()
  38.         handler.Account = sys.argv[1]
  39.         Message = sys.argv[2]
  40.         handler.MessageBody = Message.decode(handler.DefaultEncode)
  41.         handler.SendMessage()
  42.     else:
  43.         print ’serversaid.py YOUR_GTALK MESSAGE ’

 

这里为了防止消息的滥发,使用前最好先到 http://server-say.appspot.com/ 注册一下。没有注册的IP每小时仅能发送10条消息,我想大部分情况下也够用了。注册了的用户可以无限制的发送消息了,除非我在GAE注册的那张信用卡里的钱花光——我会哭的。

 

啥也不说了,PHP接口也搞定了!

 

  1. < ?php
  2. /*
  3.  *    Gtalk 通告机器人 Ver 0.1
  4.  *
  5.  *    Litrin Jiang 2010/12/02
  6.  *
  7.  * ——————————–
  8.  *  1. 2010/12: v0.1 原型实现
  9.  *
  10.  */
  11. Class Gtalk{
  12.     private $APIUrl = ’Http://server-say.appspot.com/api?’;
  13.     //Api 的地址,不要修改
  14.     public $mothod = ’get’;
  15.     //默认的提交方式,现阶段仅支持get
  16.     public $account = ”;
  17.     //接收人的Gtalk账户
  18.     public $messageBody = ”;
  19.     //消息主体,最多支持140个字符
  20.     public $Charset = ’UTF-8′;
  21.     public function Send($account=null, $messageBody=null){
  22.         if (is_array($account)){
  23.             foreach ($account as $key) {
  24.                 $this->Send($key);
  25.             }
  26.         }
  27.         if ($account === null){
  28.             $account = $this.account;
  29.         }
  30.         $this->CheckAccount($account);
  31.         if($messageBody === null){
  32.             $messageBody = $this->messageBody;
  33.         }
  34.         if ($this->Charset != ’UTF-8′){
  35.             $messageBody = iconv(“UTF-8″, $this->Charset.’//IGNORE’, $messageBody);
  36.         }
  37.         $this->CheckMessage($messageBody);
  38.         $url = $this->APIUrl .’account=’ . urlencode($account) . ’&message=’ .  urlencode($messageBody);
  39.         $query = file($url);
  40.         /*
  41.         if($query == ’200′){
  42.             return true;
  43.         }else{
  44.             return false;
  45.         }*/
  46.     }
  47.     private function CheckAccount($account){
  48.         $regexString = ’^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w{2,5}$’;
  49.         echo ereg($regexString, $account);
  50.         if (ereg($regexString, $account) != true){
  51.             #throw new Exception(“Value not a Email account! ”);
  52.         }
  53.     }
  54.     private function CheckMessage($messageBody){
  55.         $regexString = ’^.{1,140}’;
  56.         if (ereg($regexString, $messageBody) != true){
  57.             #throw new Exception(“Message not a allowed format! ”);
  58.         }
  59.     }
  60. }
  61. ?>

http://www.litrin.net/2010/12/02/gtalk%E9%80%9A%E7%9F%A5%E6%9C%BA%E5%99%A8%E4%BA%BA%E8%84%9A%E6%9C%AC/

 

python 给Gtalk 发送消息

http://www.zhlwish.com/2011/04/04/pyxmpp_gtalk/

#!/usr/bin/python
# -*- coding: utf-8 -*-

from pyxmpp.jid import JID
from pyxmpp.message import Message
from pyxmpp.jabber.client import JabberClient
from pyxmpp.jabber.simple import send_message
from pyxmpp import streamtls

class Gtalk():
    def __init__(self, sid, spwd):
        self.sid = JID(sid)
        self.spwd = spwd

    def send_msg(self, rid,  msg):
        self.rid = JID(rid)
        if not self.sid.resource:
            self.sid = JID(self.sid.node, self.sid.domain, 'send_message')

        msg = Message(to_jid=self.rid, body=msg)
        def send(stream):
            stream.send(msg)

        self.xmpp_do(send)

    def xmpp_do(self, function):
        class Client(JabberClient):
            def session_started(self):
                function(self.stream)
                self.disconnect()

        tls = streamtls.TLSSettings(require=True, verify_peer=False)
        auth = ['sasl:PLAIN']
        gtalkClient = Client(self.sid, self.spwd, tls_settings=tls, auth_methods=auth)
        gtalkClient.connect()
        try:
            gtalkClient.loop(1)
        except KeyboardInterrupt:
            print u'disconnecting...'
            gtalkClient.disconnect()

if __name__ == '__main__':
    g = Gtalk('myaccount@gmail.com', u'mypassword')
    g.send_msg('to@gmail.com', 'message')

 

 

 

 

mail 给本地所有用户脚本

把邮件发给所有的用户(Linux)

(2008-07-11 13:41:41)

标签:

技巧

it

分类: 技巧灵感
#!/bin/csh
#
# 有时,需要把邮件发送给系统上的所有用户。硬件升级时警示用户的信息就是一个好例子。
# 把邮件分别发送给每个用户非常浪费时间,这是发明邮件别名和邮寄列表的一种任务。
# 但是记录系统上所有用户的邮寄列表是个问题,如果懒于更新邮寄列表,那么添加和删除
# 用户时就极不准确了;如果系统有很多用户,那么别名表的大小很难控制。
#
# 下面的脚本称为 mailfile,提供了解决这些问题的简单方法。
# 它可直接从 /etc/passwd 文件获取登录名,并把邮件发送给所有的用户。
#
# mailfile: This script mails the specified file to all users
         of the system. It skips the first 17 accounts so
         we do not send the email to system accounts like
         ’root’.
#
# USAGE: mailfile “Subject goes here” filename.txt

#
# Check for asubject
#
if ( `echo $1 | awk ‘{ print $1 }’` == “” ) then
 echo You did not supply a subject for the message.
 echo Be sure to enclose it in quotes.
 exit 1
else
 # Get the subject of the message
 set subject=$1
endif

#
# Check for a filename
#
if ( $2 == “” ) then
 echo You did not supply a file name.
 exit 2
else
 #Get the name of hte file to send
 set filename=$2
endif

#
# Check that the ifle exists
#
if ( -f $filename ) then
 echo Sending file $filename
else
echo File does not exist.
 exit 3
endif

#
# Loop through every login name, but skip the first 17 accounts
#
foreach user ( `awk -F: ‘{ print $1 }’ /etc/passwd | tail +17` )
 # Mail the file
 echo Mailing to $user
 mail -s “$subject” $user < $filename

  # sleep for a few seconds so we don;t overload the mailer
 # On fast systems or systems with few accounts, you can
 # probably take this delay out.

  sleep 2
end

    该脚本接收两个参数,第一个是邮件的主题,它包括在引号中;第二个是包含要发送邮件文本的文件名。因此,要把邮件发送给所有的用户,警告用户服务器硬件要升级,命令如下所示:

    mailfile “System upgrade at 5:pm” upgrade.txt

    upgrade.txt文件包含发送给所有用户的邮件文本。这个方法真正的用途所在就是可以保存该文本文件并加以简单修改,下次升级系统时就可以再发送它了。

    提示:如果用户使用基于文本的登录而不是图形登录,那么就可以把邮件添加到 /etc/motd 文件上,并让它们可到达用户。该文件中的任何文本将在用户登录之后及第一个 shell 提示符出现之前,显示在每个用户的屏幕上。