|
#1
|
|||
|
|||
Script to automate passwords on multiple servers?
I'm looking to do the following but am not sure if I can do this with a SecureCRT script. Here's basically what I want to do.
First I am already logged into the Solaris 10 server via SecureCRT. I want to execute these commands FROM the server I am already logged into: 1.) Execute command - cat server_list.txt 2.) Read in the list of server names and store them. 3.) ssh first server name 4.) If this comes up on the screen "Are you sure you want to continue connecting (yes/no)?" Then send yes else continue 5.) This will display "Password: " send pop up - "Please enter your password" store password and send it to the terminal. 6.) Run command: su - 7.) Wait for "Password: " and send to screen - Please enter root password. store root password. 8.) Next run command passwd root 9.) Wait for "New Password: " 10.) send pop up with screen asking for a new root password and store it. 11.) Send new password 12.) Wait for "Re-enter new Password: " and send password again. 13.) Wait for "passwd: password successfully changed for root" 14.) send "exit" twice to logout of the server and return to next server in list and then repeat steps 4-13 until the list has expired. That's pretty much what I'm wanting to do. I have a list of about 50 servers I need to change the root password for and rather than having to do it manually I figured a script would be the easiest way to go about this. Even better would be if it presented me with a screen right up front that asked me for the variables I need and then just ran the script: so it would ask: Input YOUR Password: Current root password: NEW root password: and then run and do its thing... Any help with this would be great. Last edited by darkoth; 08-22-2008 at 08:12 AM. |
#2
|
|||
|
|||
Hello darkoth.
Here is some information that shows you how you might accomplish your goals with scripting: Code:
'~ 1.) Execute command - '~ cat server_list.txt crt.Screen.Synchronous = True crt.Screen.Send "cat server_list.txt" & vbcr '~ 2.) Read in the list of server names and store them. vServerList = Split(crt.Screen.ReadString("]$"), vbcr) '~ 3.) ssh first server name For Each szHost in vServerList crt.Screen.Send "ssh " & szHost & vbcr '~ 4.) If this comes up on the screen '~ "Are you sure you want to continue connecting (yes/no)?" '~ Then send yes else continue '~ 5.) This will display '~ "Password: " '~ send pop up - "Please enter your password" '~ store password and send it to the terminal. Do szResults = Crt.Screen.WaitforStrings("Are you sure...", "Password:", 60) = 1 Select Case szResult Case 1 crt.Screen.Send "yes" & vbcr Case 2 szPassword = crt.dialog.prompt("Please enter your password", "Password", "", True) crt.Screen.Send szPassword & vbcr exit do Case else MsgBox "We timed out" end select Loop '~ 6.) Run command: '~ su - crt.Screen.Send "su -" & vbcr '~ 7.) Wait for "Password: " and send to screen - Please enter root password. '~ store root password. crt.Screen.WaitForString "Password:" szRootPassword = crt.dialog.Prompt("Please enter the root password: ", "Root Password", "", True) crt.Screen.Send szRootPassword & vbcr '~ 8.) Next run command '~ passwd root crt.Screen.Send "passwd root" & vbcr '~ 9.) Wait for "New Password: " '~ 10.) send pop up with screen asking for a new root password and store it. Do szNewPassword = crt.dialog.prompt("Please enter the new password: ", "New Password", "", True) szConfirmPassword = crt.dialog.prompt("Please confirm your new password: ", "Confirm Password", "", True) if szNewPassword <> szConfirmPassword then MsgBox "User did not provide matching passwords" end if While szNewPassword <> szConfirmPassword '~ 11.) Send new password crt.screen.Send szNewPassword & vbcr '~ 12.) Wait for "Re-enter new Password: " and send password again. crt.Screen.WaitForString "Re-enter new Password:" crt.Screen.Send szNewPassword & vbcr '~ 13.) Wait for "passwd: password successfully changed for root" crt.Screen.WaitForString "passwd: password successfully changed for root" '~ 14.) exit server and return to next server in list and then repeat steps 4-13 until the list has expired. crt.Screen.Send "exit" & vbcr Next Thank you JJH |
#3
|
|||
|
|||
Hrm. I'm getting an "unexpected 'next". I'm not all that versed with VB as of yet. FYI. I'm using Version 6.1 of SecureCRT
Code:
#$language = "VBScript" #$interface = "1.0" crt.Screen.Synchronous = True Sub Main crt.Screen.Send "cat server_list.txt" & vbcr vServerList = Split(crt.Screen.ReadString("]$"), vbcr) For Each szHost in vServerList crt.Screen.Send "ssh " & szHost & vbcr Do szResults = Crt.Screen.WaitforStrings("Are you sure...", "Password:", 60) = 1 Select Case szResult Case 1 crt.Screen.Send "yes" & vbcr Case 2 szPassword = crt.dialog.prompt("Please enter your password", "Password", "", True) crt.Screen.Send szPassword & vbcr exit do Case else MsgBox "We timed out" end select Loop crt.Screen.Send "su -" & vbcr crt.Screen.WaitForString "Password:" szRootPassword = crt.dialog.Prompt("Please enter the root password: ", "Root Password", "", True) crt.Screen.Send szRootPassword & vbcr crt.Screen.Send "passwd root" & vbcr Do szNewPassword = crt.dialog.prompt("Please enter the new password: ", "New Password", "", True) szConfirmPassword = crt.dialog.prompt("Please confirm your new password: ", "Confirm Password", "", True) if szNewPassword <> szConfirmPassword then MsgBox "User did not provide matching passwords" end if While szNewPassword <> szConfirmPassword crt.screen.Send szNewPassword & vbcr crt.Screen.WaitForString "Re-enter new Password:" crt.Screen.Send szNewPassword & vbcr crt.Screen.WaitForString "passwd: password successfully changed for root" crt.Screen.Send "exit" & vbcr Next End Sub Last edited by darkoth; 08-25-2008 at 08:04 AM. |
#4
|
|||
|
|||
I've made some changes to the script, which you can see in
the attached screenshot. As you can see, the following changes were made: We had originally defined "szRezults", but we were using "szResult", so I changed "szResults" to "szResult" to match. Next, I made a change to wait for the prompt before starting the password change The next changes I made were to exit the sub if the user cancels the "New Password" or "Confirm Password" prompts. The next change fixes a problem with the Do, Loop. I think this is the actual problem you experienced. Lastly, I made a change to wait for the prompt before starting the process over again. Here is the new version of the script: Code:
#$language = "VBScript" #$interface = "1.0" crt.Screen.Synchronous = True Sub Main crt.Screen.Send "cat server_list.txt" & vbcr vServerList = Split(crt.Screen.ReadString("]$"), vbcr) For Each szHost in vServerList crt.Screen.Send "ssh " & szHost & vbcr Do szResult = Crt.Screen.WaitforStrings("Are you sure...", "Password:", 60) = 1 Select Case szResult Case 1 crt.Screen.Send "yes" & vbcr Case 2 szPassword = crt.dialog.prompt("Please enter your password", "Password", "", True) crt.Screen.Send szPassword & vbcr exit do Case else MsgBox "We timed out" Exit sub end select Loop crt.Screen.Send "su -" & vbcr crt.Screen.WaitForString "Password:" szRootPassword = crt.dialog.Prompt("Please enter the root password: ", "Root Password", "", True) crt.Screen.Send szRootPassword & vbcr szResult = crt.screen.waitforstring ("]$", 10) If szResult = 0 then msgbox "Did not find root shell prompt." Exit sub End if crt.Screen.Send "passwd root" & vbcr Do szNewPassword = crt.dialog.prompt("Please enter the new password: ", "New Password", "", True) If szNewPassword = "" then exit sub szConfirmPassword = crt.dialog.prompt("Please confirm your new password: ", "Confirm Password", "", True) If szConfirmPassword = "" then exit sub if szNewPassword <> szConfirmPassword then MsgBox "User did not provide matching passwords" Else Exit Do end if Loop crt.screen.Send szNewPassword & vbcr crt.Screen.WaitForString "Re-enter new Password:" crt.Screen.Send szNewPassword & vbcr crt.Screen.WaitForString "passwd: password successfully changed for root" crt.Screen.Send "exit" & vbcr crt.screen.WaitForString "]$" Next End Sub JJH |
#5
|
|||
|
|||
I tried and now its actually doing this when I try to run it:
Code:
]$ cat server_list.txt frodo samwise ]$ ssh cat server_list.txt ssh: cat: host/servname not known Code:
#$language = "VBScript" #$interface = "1.0" Sub Main Dim szPrompt, objTab szPrompt = "#$" Set objTab = crt.GetScriptTab objTab.Screen.Synchronous = True 'objTab.Screen.IgnoreEscape = True szCommand = "cat server_list.txt" objTab.Screen.Send szCommand & vbcr objTab.Screen.WaitForString szCommand & vbcr vServerList = objTab.Screen.ReadString(szPrompt) 'vServerList = Split(objTab.Screen.ReadString(), vbcr) crt.Dialog.Messagebox vServerList For Each szHost in vServerList objTab.Screen.Send "ssh " & szHost & vbcr Do szResult = Crt.Screen.WaitforStrings("Are you sure...", "Password:", 60) = 1 Select Case szResult Case 1 objTab.Screen.Send "yes" & vbcr Case 2 szPassword = crt.dialog.prompt("Please enter your password", "Password", "", True) objTab.Screen.Send szPassword & vbcr exit do Case else MsgBox "We timed out" Exit sub end select Loop objTab.Screen.Send "su -" & vbcr objTab.Screen.WaitForString "Password:" szRootPassword = crt.dialog.Prompt("Please enter the root password: ", "Root Password", "", True) objTab.Screen.Send szRootPassword & vbcr szResult = objTab.screen.waitforstring ("]#", 10) If szResult = 0 then msgbox "Did not find root shell prompt." Exit sub End if objTab.Screen.Send "passwd root" & vbcr Do szNewPassword = crt.dialog.prompt("Please enter the new password: ", "New Password", "", True) If szNewPassword = "" then exit sub szConfirmPassword = crt.dialog.prompt("Please confirm your new password: ", "Confirm Password", "", True) If szConfirmPassword = "" then exit sub if szNewPassword <> szConfirmPassword then MsgBox "User did not provide matching passwords" Else Exit Do end if Loop objTab.screen.Send szNewPassword & vbcr objTab.Screen.WaitForString "Re-enter new Password:" objTab.Screen.Send szNewPassword & vbcr objTab.Screen.WaitForString "passwd: password successfully changed for root" objTab.Screen.Send "exit" & vbcr objTab.screen.WaitForString "]#" Next End Sub Last edited by darkoth; 08-25-2008 at 01:09 PM. |
#6
|
|||
|
|||
I notice that you are using the following in your new code:
Code:
objTab.Screen.WaitForString szCommand & vbcr vServerList = objTab.Screen.ReadString(szPrompt) 'vServerList = Split(objTab.Screen.ReadString(), vbcr) crt.Dialog.Messagebox vServerList an array, which is what the split does for you. If you don't use split, you end up with just a string that doesn't allow you to parse just the information you are looking for. Try changing that portion of your code to look like this: Code:
objTab.Screen.WaitForString szCommand & vbcr vServerList = Split(objTab.Screen.ReadString(szPrompt), vbcr) ' crt.Dialog.Messagebox vServerList commented out is that since it is now an array, you'd get an error attempting to display it as a regular string. Does that work better for you? JJH Last edited by jdev; 08-25-2008 at 04:30 PM. |
![]() |
Thread Tools | |
Display Modes | Rate This Thread |
|
|