如何使用ssh命令在命令中发送密码

时间:2015-07-22 06:03:59

标签: java git ssh jsch

我正在使用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的密码。

2 个答案:

答案 0 :(得分:1)

我尝试使用你的代码访问我的linux盒子 - 它确实成功登录,但随后无法发送任何命令。我不确定你的问题是否存在 - 但我会在这里添加我的解决方案,以防万一。

shellStream.println();命令移动到自己的函数:

public static void sendCommand(String c) {
    shellStream.print(c + "\n");
    shellStream.flush();
}

必须在此过程中制作shellChannelshellStream个全局变量。

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();
    }
}

答案 1 :(得分:0)

session.setConfig("PreferredAuthentications", "publickey,keyboard-interactive,password");

Keyboard-interactive这里的意思是密码必须用键盘提示。即使有通过命令行传递密码的方法,SSH也非常高峰。

最好的方法是使用pubkey身份验证,但如果这不是一个选项,请尝试仅使用password

登录
session.setConfig("PreferredAuthentications", "password");

您也可以使用

发送密码
session.setPassword("password");