Используйте адрес привязки с Jsch Session - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь установить адрес, чтобы, когда я покидаю свой сервер для поиска файла, я не оставлял имя хоста сервера в качестве другого ip.Линукс сторона всех вещей настроена.Я могу запустить следующую команду ssh, и все работает как положено.

ssh -b 1.1.1.1 testuser@sshhost

Моя проблема в настоящее время я пытаюсь использовать JSch для просмотра файлов, но я не могу определить правильную настройку сеанса.Я использую открытые закрытые ключи, и они работают правильно.Ниже мой текущий процесс.

JSch jsch = new JSch();
Keypair keyPair = KeyPair.load(jsch, privateKey, publicKey);
boolean keyPairdecrpy = keyPair.decrypt(passphrase);
if(keyPairdecrpy)
{
    jsch.addIdentity(privateKey, passphrase);
}
Session session = jsch.getSession("user", "sshhost", 22);
Properties config new Properties();
config.put("StrickHostKeyChecking:, "no");
config.put("PreferredAuthentications", "publickey");
session.setConfig(config);
session.connect(timeout);

Итак, вещи, которые я до сих пор пробовал.

  1. Создание фабрики сокетов, устанавливающей адрес привязки и затем запускающей

    InetSocketAddress addr = new InetSicketAddress("1.1.1.1", 0);
    Socket socket = new Socket(sshhost, 22);
    socket.bind(addr);
    session.setSocketFactory((SocketFactory) socket);
    
  2. Попытка использовать встроенную переадресацию портов с классом сеанса

    session.setPortForwardingL(0, "1.1.1.1", 22);
    

1 Ответ

0 голосов
/ 14 мая 2019

Использование следующего SocketFactory сработало для меня:

class MySocketFactory implements SocketFactory {

    @Override
    public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
        Socket socket = new Socket();
        socket.bind(new InetSocketAddress("1.1.1.1", 0));
        socket.connect(new InetSocketAddress(host, port));

        return socket;
    }

    @Override
    public InputStream getInputStream(Socket socket) throws IOException {
        return socket.getInputStream();
    }

    @Override
    public OutputStream getOutputStream(Socket socket) throws IOException {
        return socket.getOutputStream();
    }

}

Я проверил это с помощью netstat -an на моем компьютере с Linux и заметил, что локальная сторона соединения была привязана к 1.1.1.1 с эфемернойномер порта (я временно настроил интерфейс с этим адресом).

Я установил заводские настройки непосредственно перед вызовом session.connect():

SocketFactory sfactory = new MySocketFactory();
session.setSocketFactory(sfactory);

session.connect();
...