您的位置:首页 > 编程语言 > Python开发

用python脚本执行ssh远程登录多台机器

2012-08-29 14:27 591 查看


Kids Return: [Python ]一个用ssh 来远程登录 多台机器并执行命令的脚本

[Python ]一个用ssh 来远程登录 多台机器并执行命令的脚本 .... 阅读器无法显示某些pdf文档的中文问题 · Ubuntu以及MacOS下使用街机模拟 器Mame · [Python ]Python 3.0来了 ...

apc999.blogspot.com/2009/01/python _19.html - 网页快照 - 类似结果

来源:apc999.blogspot.com/2009/01/python _19.html(以上为GOOGLE搜索结果,因blogspot被墙了,故转载止此处,供己收藏,亦与众分享)

功能类似于multissh。事实上我也抄了这个名字//grin。

要求安装了pexpect 这个包先。

用法见usage:

Usage: ./multissh.py -f cmdfile -l username -c cmd -n nodesfile -v -r

execut cmd on remote hosts (all hosts in ./hosts.txt by default)

-v verbose

-r recording hosts on which mission succeeded and failed

-l username

-c cmd to be executed remotely

-n file containing the nodes

-f file conaining the cmd

-h show the usage

就是指定一个文件比如nodes.txt以及命令以后,它可以自动登录 到nodes.txt包含的节点里执行命令。可以在源文件里替换进你自己的密码,也可以使用公钥密钥登录 不需输入密码。指定了v选项的话得到在远端每台主机上的详细输出。指定了r选项的话记录下那些节点成功那些节点失败。

我前面的帖子里有关于ansi_color的一个脚本,拿过来可以配合使用得到彩色输出

Python代码



1. #!/usr/bin/python

2. import sys

3. import os

4. import getopt

5. import pexpect

6. try:

7. from ansi_color import * #就是我前面帖子里关于ansi_color的几个定义

8. except ImportError:

9. def color_str(s, *args):

10. return s

11. fg_green = None

12. fg_red = None

13. fg_blue = None

14. password="123456" #替换成你自己的密码。

15. def do(cmds, dst, username, outfile):

16. global verbose, is_quiet, good_hosts

17. print "executing \"%s\""%(repr(cmds))

18. try:

19. prompt = "^.*\(.*\):|\$"

20. hostname = dst

21. sshcmd = '<b style="color: black; background-color: rgb(153, 255, 153);">ssh</b> %s'%(hostname)

22. if username != None:

23. sshcmd = sshcmd + " -l %s"%username

24. s = pexpect.spawn(command=sshcmd, timeout=20)

25. s.logfile_read = outfile

26. s.setecho(True)

27. i = -1

28. while (i<>0):

29. i = s.expect([prompt,"Are you sure you want to continue connecting (yes/no)?","Password:"])

30. if i == 1:

31. s.sendline("yes")

32. elif i == 2:

33. s.sendline(password)

34. for cmd in cmds:

35. s.sendline(cmd)

36. s.expect(prompt)

37. s.sendline("exit")

38. s.close()

39. if verbose:

40. print

41. print "["+color_str("OK!", fg_green)+"]"

42. if recording:

43. print>>f_good, hostname

44. f_good.flush()

45. good_hosts.append(hostname)

46. except pexpect.ExceptionPexpect:

47. if verbose:

48. print

49. print "["+color_str("Fail!", fg_red)+"]"

50. if recording:

51. print>>f_bad, hostname

52. f_bad.flush()

53. bad_hosts.append(hostname)

54. def print_usage():

55. print "Usage:\t ./make_do.py -f cmdfile -l username -c cmd -n nodesfile -v -r"

56. print "execut cmd on remote hosts (all hosts in ./hosts.txt by default)"

57. print "\t-v verbose"

58. print "\t-r recording hosts on which mission succeeded and failed"

59. print "\t-l username"

60. print "\t-c cmd to be executed remotely"

61. print "\t-n file containing the nodes"

62. print "\t-f file conaining the cmd"

63. print "\t-h show the usage"

64. sys.exit(-1)

65. if __name__ == "__main__":

66. try:

67. opts, args=getopt.getopt(sys.argv[1:], "l:f:n:c:vhr",["login_name", "cmdfile","nodesfile","command","help","verbose", "recording"])

68. except getopt.GetoptError, err:

69. print str(err)

70. print_usage()

71. if opts == [] and args == []:

72. print_usage()

73. hosts = None

74. cmds = None

75. outfile = open("/dev/null", "w")

76. verbose = False

77. username = None

78. recording = False

79. for o, ra in opts:

80. a = ra.strip(" \t\n")

81. if o in ("-h", "--help"):

82. print_usage()

83. elif o in ("-n", "--nodesfile"):

84. h = open(a, 'r')

85. hosts = [l.strip(" \t\n") for l in h]

86. elif o in ("-c", "--command"):

87. cmds = [a]

88. elif o in ("-f", "--cmdfile"):

89. cmdfile = open(a, "r")

90. cmds = [cmd.strip(' \n') for cmd in cmdfile]

91. elif o in ("-v", "--verbose"):

92. outfile = sys.stdout

93. verbose = True

94. elif o in ("-r", "--recording"):

95. recording = True

96. elif o in ("-l", "--login_name"):

97. username = a

98. if hosts is None:

99. print "using default ./hosts.txt"

100. h = open(os.path.join(os.path.expanduser("."), "hosts.txt"),'r')

101. hosts = [dst.strip(' \n') for dst in h]

102. if cmds is None:

103. print "-c or -f must specified"

104. print_usage()

105. if recording:

106. f_good = open("good_hosts.txt","w")

107. f_bad = open("bad_hosts.txt","w")

108. good_hosts =[]

109. bad_hosts =[]

110. for i in range(len(hosts)):

111. dst = hosts[i]

112. print "%d/%d: ["%(i+1, len(hosts))+ color_str(dst, fg_blue)+"]"

113. do(cmds, dst, username, outfile)

114. print "%d hosts suceed!"%len(good_hosts)

115. outfile.close()

116. h.close()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: