如何使用ssh命令在命令中发送密码
How to send password in command using ssh command
我正在使用 Jsch 库连接我的服务器。连接后我传递的命令需要密码才能继续,因此我只在命令中传递我的密码但没有任何反应。
代码:
JSch jsch = new JSch();
jsch.removeAllIdentity();
Session session = jsch.getSession(user, host, port);
session.setPassword(password);
.setConfig("StrictHostKeyChecking", "no");
session.setConfig("PubkeyAuthentication", "no");
System.out.println("Establishing Connection...");
session.setConfig("PreferredAuthentications",
"publickey,keyboard-interactive,password");
session.connect();
System.out.println("Connection established.");
System.out.println("Crating SFTP Channel.");`
Channel shellChannel = session.openChannel("shell");
shellChannel.connect();
((ChannelShell) shellChannel).setPty(true);
shellChannel.setInputStream(System.in);
shellChannel.setOutputStream(System.out);
PrintStream shellStream = new PrintStream(
shellChannel.getOutputStream());
shellChannel.connect();
shellStream
.println("cd /usr/local/apache2/; ls; cd ../www; ls; git fetch origin; <mypasssword>");
shellStream.flush();
System.out.println("SFTP Channel created.");`
当我 运行 此代码 git 询问密码以继续进行。
注意:我无法禁用 git fetch origin.
的密码
session.setConfig("PreferredAuthentications", "publickey,keyboard-interactive,password");
Keyboard-interactive
这里的意思是密码必须用键盘输入。 SSH 对此非常敏感,即使有办法通过命令行传递密码。
最好的方法是使用公钥身份验证,但如果不行,请尝试仅使用 password
登录
session.setConfig("PreferredAuthentications", "password");
您也可以使用
发送密码
session.setPassword("password");
我试过你的代码来访问我的 linux 框 - 它确实登录成功,但随后无法发送任何命令。我不确定这是否是您遇到的问题 - 但我会在此处添加我的解决方案,以防万一。
将 shellStream.println();
命令移动到它自己的函数中:
public static void sendCommand(String c) {
shellStream.print(c + "\n");
shellStream.flush();
}
必须在进程中创建 shellChannel
和 shellStream
全局变量。
已将 shellStream.println();
更改为 shellStream.print("\n");
,因为上述内容无法正常工作。
在你的这行代码之后:
shellStream = new PrintStream(shellChannel.getOutputStream());
添加了我的命令序列:
Thread.sleep(1000); // wait for it to connect
sendCommand("sudo su"); // the command I tried
Thread.sleep(1000); // not sure how long you need to wait
sendCommand("mypassword");
Thread.sleep(1000);
// etc.
顺便说一下,您在代码中调用了两次 shellChannel.connect();
- 我删除了最后一个。
这是您的代码的最终工作版本:
import java.io.IOException;
import java.io.PrintStream;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelShell;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
public class MyShell {
static String user = "daniel";
static String host = "localhost";
static int port = 22;
static String password = "mypass";
static Session session;
static Channel shellChannel;
static PrintStream shellStream;
public static void main(String[] args) throws JSchException, IOException,
InterruptedException {
JSch jsch = new JSch();
jsch.removeAllIdentity();
session = jsch.getSession(user, host, port);
session.setPassword(password);
session.setConfig("StrictHostKeyChecking", "no");
session.setConfig("PubkeyAuthentication", "no");
System.out.println("Establishing Connection...");
session.setConfig("PreferredAuthentications",
"publickey,keyboard-interactive,password");
session.connect();
System.out.println("Connection established.");
System.out.println("Crating SFTP Channel.");
shellChannel = session.openChannel("shell");
shellChannel.connect();
((ChannelShell) shellChannel).setPty(true);
shellChannel.setInputStream(System.in);
shellChannel.setOutputStream(System.out);
shellStream = new PrintStream(shellChannel.getOutputStream());
Thread.sleep(1000);
sendCommand("sudo su");
Thread.sleep(1000);
sendCommand("mypass");
Thread.sleep(1000);
sendCommand("ls");
}
public static void sendCommand(String c) {
shellStream.print(c + "\n");
shellStream.flush();
}
}
我正在使用 Jsch 库连接我的服务器。连接后我传递的命令需要密码才能继续,因此我只在命令中传递我的密码但没有任何反应。
代码:
JSch jsch = new JSch();
jsch.removeAllIdentity();
Session session = jsch.getSession(user, host, port);
session.setPassword(password);
.setConfig("StrictHostKeyChecking", "no");
session.setConfig("PubkeyAuthentication", "no");
System.out.println("Establishing Connection...");
session.setConfig("PreferredAuthentications",
"publickey,keyboard-interactive,password");
session.connect();
System.out.println("Connection established.");
System.out.println("Crating SFTP Channel.");`
Channel shellChannel = session.openChannel("shell");
shellChannel.connect();
((ChannelShell) shellChannel).setPty(true);
shellChannel.setInputStream(System.in);
shellChannel.setOutputStream(System.out);
PrintStream shellStream = new PrintStream(
shellChannel.getOutputStream());
shellChannel.connect();
shellStream
.println("cd /usr/local/apache2/; ls; cd ../www; ls; git fetch origin; <mypasssword>");
shellStream.flush();
System.out.println("SFTP Channel created.");`
当我 运行 此代码 git 询问密码以继续进行。 注意:我无法禁用 git fetch origin.
的密码session.setConfig("PreferredAuthentications", "publickey,keyboard-interactive,password");
Keyboard-interactive
这里的意思是密码必须用键盘输入。 SSH 对此非常敏感,即使有办法通过命令行传递密码。
最好的方法是使用公钥身份验证,但如果不行,请尝试仅使用 password
session.setConfig("PreferredAuthentications", "password");
您也可以使用
发送密码session.setPassword("password");
我试过你的代码来访问我的 linux 框 - 它确实登录成功,但随后无法发送任何命令。我不确定这是否是您遇到的问题 - 但我会在此处添加我的解决方案,以防万一。
将 shellStream.println();
命令移动到它自己的函数中:
public static void sendCommand(String c) {
shellStream.print(c + "\n");
shellStream.flush();
}
必须在进程中创建 shellChannel
和 shellStream
全局变量。
已将 shellStream.println();
更改为 shellStream.print("\n");
,因为上述内容无法正常工作。
在你的这行代码之后:
shellStream = new PrintStream(shellChannel.getOutputStream());
添加了我的命令序列:
Thread.sleep(1000); // wait for it to connect
sendCommand("sudo su"); // the command I tried
Thread.sleep(1000); // not sure how long you need to wait
sendCommand("mypassword");
Thread.sleep(1000);
// etc.
顺便说一下,您在代码中调用了两次 shellChannel.connect();
- 我删除了最后一个。
这是您的代码的最终工作版本:
import java.io.IOException;
import java.io.PrintStream;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelShell;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
public class MyShell {
static String user = "daniel";
static String host = "localhost";
static int port = 22;
static String password = "mypass";
static Session session;
static Channel shellChannel;
static PrintStream shellStream;
public static void main(String[] args) throws JSchException, IOException,
InterruptedException {
JSch jsch = new JSch();
jsch.removeAllIdentity();
session = jsch.getSession(user, host, port);
session.setPassword(password);
session.setConfig("StrictHostKeyChecking", "no");
session.setConfig("PubkeyAuthentication", "no");
System.out.println("Establishing Connection...");
session.setConfig("PreferredAuthentications",
"publickey,keyboard-interactive,password");
session.connect();
System.out.println("Connection established.");
System.out.println("Crating SFTP Channel.");
shellChannel = session.openChannel("shell");
shellChannel.connect();
((ChannelShell) shellChannel).setPty(true);
shellChannel.setInputStream(System.in);
shellChannel.setOutputStream(System.out);
shellStream = new PrintStream(shellChannel.getOutputStream());
Thread.sleep(1000);
sendCommand("sudo su");
Thread.sleep(1000);
sendCommand("mypass");
Thread.sleep(1000);
sendCommand("ls");
}
public static void sendCommand(String c) {
shellStream.print(c + "\n");
shellStream.flush();
}
}