java jsch -executing multiple unix commands - jsch

Channel channel=session.openChannel("exec");
((ChannelExec)channel).setCommand("cd ../ && pwd && ls");
channel.connect();
channel.run();
Here how can i use the above code if my commands are from command line arguments or if they are stored in variable like cmd1 ,cmd2 etc
i tried
((ChannelExec)channel).setCommand("cmd1 && cmd2 && cmd3");
variable substitution is not happening. Please help me on this
Thanks,
Prashanth

The variables need to be specified outside of the String itself rather than being part of a String
((ChannelExec)channel).setCommand(cmd1 + " && " + cmd2 " + " && " + cmd3);

Related

WaitForExit with CMD option "/c"

I've written code in VB to run a CMD command, where the output is stored to a text file. This output is then needed for the program, so the program needs to wait until the CMD command has finished before continuing. I am using
Dim wait As Process = Process.Start(psi)
wait.WaitForExit()
To make sure the process exits before the code continues, but now that I've done that, the "/c" option in the process info is no longer working. The process info is as follows:
Dim psi As New ProcessStartInfo With {
.FileName = "Cmd",
.Arguments = "/c " & completedCom & " > " & oPath
}
I do not understand why the "/c" option would fail all of a sudden.
Spaces would be an example of one problem. Use quotes around your commands to help with that:
Dim psi As New ProcessStartInfo With {
.FileName = "Cmd",
.Arguments = "/c """ & completedCom & """ > """ & oPath & """"
}
The preferred method of calls to process would be to directly call the exec, rather than launching a cmd. In that case, you would have to capture the standard output asynchronously and write it to a file though.

How to use multiple commands with path references in command prompt

I'm new to this forum, so please correct me if I'm asking this the wrong way or not specific enough..
While coding in VB.NET I'm trying to pass multiple commands, and an argument containing a reference to a path:
Dim p As New Process
Dim pi As New ProcessStartInfo
pi.Arguments = " " & "/K """ & "C:\program files\gdal\gdalshell.bat" & """ & " & "cd C:\program files\gdal" & _
" & " + "gdal_translate" + " -of Jpeg -outsize 2000 2000 """ & "D:\box sync\my box (907070)\RIS_RHDHV_Overgang\GDAL\test2.xml" & """ "
pi.FileName = "C:\windows\syswow64\cmd.exe"
p.StartInfo = pi
p.Start()
The command prompt returns:
'C:\Program' is not recognized as an internal or external command, operable program or batch file.
I did some research on the matter and found:
vb.net How to pass a string with spaces to the command line
This however still doesn't seem to solve the problem. When I execute the following code, it runs without issues:
Dim p As New Process
Dim pi As New ProcessStartInfo
pi.Arguments = " " & "/K """ & "C:\program files\gdal\gdalshell.bat" & """ & " & "cd C:\program files\gdal" & _
" & " + "gdal_translate"
pi.FileName = "C:\windows\syswow64\cmd.exe"
p.StartInfo = pi
p.Start()
To me it looks like the problem is caused by the path reference inside an argument. I have read and used the different answers for using multiple commands, without any luck.
It would be great if someone could help me on this topic.
Kind regards,
Stuart
First of all, as a little note you don't need to add a space in the beginning of the arguments. That's only done when you write the entire command (including the executable) in one line.
Now, the correct way to pass a path as an argument is to surround it with quotes. So something like this should do:
(please note that I have also shortened some unnecessary concatenations, etc.)
pi.Arguments = "/K """"C:\program files\gdal\gdalshell.bat"" & cd ""C:\program files\gdal"" & " & _
"gdal_translate -of Jpeg -outsize 2000 2000 ""D:\box sync\my box (907070)\RIS_RHDHV_Overgang\GDAL\test2.xml"""""
EDIT:
I found that you also have to put the entire text after /K in quotes for it to work.

Running and saving command output using VBA

I am trying to run shell commands from VBA and get output into a csv file. Below is the code I am using:
Dim wsh as Object
Set wsh = VBA.CreateObject("WScript.Shell")
plink_path="C:\plink.exe"
key_path="putty key path"
pass_query="select * from test"
command1 = Replace(plink_path & " hadoop#11.11.11.11 -i " & key_path & " mysql -uuser -ppass -e 'use radar;" & pass_query & "'", Chr(10), " ")
wsh.Run command1 & ">E:/anurag.csv", 0, True
But I am not able to view output file in the E drive. When I run the above command manually from a cmd prompt I do get an output in the E drive.
Two thoughts:
Try E:\anurag.csv instead of E:/anurag.csv
Use cmd to invoke plink, since cmd usually processes the redirections. Replace the wsh.Run line with:
command1 = command1 & ">E:\anurag.csv"
command1 = "cmd /c """ & command1 & """"
wsh.Run command1, 0, True
The first line completes the command you wanted to execute and the second wraps it in a cmd /c call.
If this doesn't work, try changing /c above to /c /s per this answer.
YMMV - not tested

Argument issue when using vb.net shell ()

I was trying to use shell function in vb.net to run a program and then write/export the result else where , it works on win8 but not XP !! The command line prints this error
'C:\Documents' is not recognized as an internal or external command,
operable program or batch file.
Press any key to continue . . .
Dim save as String="C:\exported.txt"
Dim command As String = tempPath & "app.exe -f " & IO.Path.GetTempPath & " -o " & save & " & pause"
shell("cmd /c " & command, AppWinStyle.NormalFocus, True)
Process.Start(IO.Path.Combine(tempPath, "app.exe"), "-f """ & IO.Path.GetTempPath & """ -o """ & Save() & """ & pause")
You hace a folder in the command with a space in it (probably the documents and Settings folder). cmd.exe has no way of telling whether the space is in the file name or the end of the file name, unless you put the file name in "" - like "C:\doxuments and Settings..."
Dim command As String = tempPath & "app.exe -f \"" & IO.Path.GetTempPath & "\" -o \"" & save & "\" & pause"
(\" is intended to escape a " so that it translates to embedding a " in the string. I'm not sure what the VB syntax is.)
EDIT:
I think #Roy van der Velde below has the 'escaping correct. The final part not checked is tempPath. See my comment on the question.

run 2 seperate cmd commands from vb forms appliaction

i want my program to open cmd , change directory and then do the command : "copy /B file1 file2 output"
this is what i have at the moment. but all that happens is a cmd window flashes for a second but no file gets created
Dim cmd1 As String
Dim cmd2 As String
cmd1 = "cd " & FolderFromFileName(imagename)
cmd2 = "copy /B " & NameOnlyFromFullPath(imagename) & "+" & "TEMP.txt" & " " & TextBox1.Text
Shell("cmd /c" & " " & cmd1 & " " & cmd2, AppWinStyle.NormalFocus)
please help, thanks :)
Do you really need to have a command prompt appear? You could do all this without a separate process by using the system.io library. If you really need the cmd prompt you can create a process.
Dim NewProcess = New Process
' a new process is created
NewProcess.StartInfo.UseShellExecute = False
' redirect IO
' PVWCmd.StartInfo.RedirectStandardOutput = True
' PVWCmd.StartInfo.RedirectStandardError = True
' PVWCmd.StartInfo.RedirectStandardInput = True
' don't even bring up the console window
NewProcess.StartInfo.CreateNoWindow = False
' executable command line info
NewProcess.StartInfo.FileName = "cmd"
NewProcess.StartInfo.WorkingDirectory = "C:\"
' NewProcess.StartInfo.Arguments = +" > """ + "LogFile.log" + """ 2>&1"
NewProcess.Start()