2015-05-26 3 views
1

Я искал способ добавления удаленной файловой системы, доступной в Bluemix. В этом post мне сказали использовать стек cflinuxfs2, который поддерживается в последних версиях Cloud Foundry.Проблемы с использованием FUSE на Bluemix

Мне удалось выполнить команду mkdir для точки монтирования из моего приложения Java и выполнить команду sshfs, но в этом последнем случае сбой: «read: Connection reset by peer».

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

Это часть Java EE код развернут в Либерти выполнения в Bluemix:

String s = null; 
Process p = null; 
BufferedReader br = null; 
try 
{ 
    p = Runtime.getRuntime().exec("mkdir -p /home/vcap/misc"); 
    br = new BufferedReader(new InputStreamReader(p.getInputStream())); 
    while((s = br.readLine()) != null) 
     System.out.println("line: " + s); 
    p.waitFor(); 
    System.out.println ("#### Executing command mkdir with exit: " + p.exitValue()); 
    p.destroy(); 
    br.close(); 

    p = Runtime.getRuntime().exec("sshfs [email protected]:/ /home/vcap/misc -o IdentityFile=/home/vcap/app/wlp/usr/servers/defaultServer/apps/myapp.ear/cloud.key -o StrictHostKeyChecking=yes -o UserKnownHostsFile=/home/vcap/app/wlp/usr/servers/defaultServer/apps/myapp.ear/known_hosts -o idmap=user -o compression=no -o sshfs_debug"); 
    br = new BufferedReader(new InputStreamReader(p.getErrorStream())); 
    while((s = br.readLine()) != null) 
     System.out.println("line: " + s); 
    p.waitFor(); 
    System.out.println ("#### Executing command sshfs with exit: " + p.exitValue()); 
    p.destroy(); 
    br.close(); 
} 
catch(IOException ex) 
{ 
    ex.printStackTrace(); 
} 
catch(InterruptedException ex) 
{ 
    ex.printStackTrace(); 
} 
finally 
{ 
    try 
    { 
     if(br != null) 
      br.close(); 
    } 
    catch(IOException ex) 
    { 
     ex.printStackTrace(); 
    } 
} 

Ссылочные файлы команд включены в файл EAR и выдвигали в качестве части приложения. Я вижу их и их контент, просматривая файловую систему с панели инструментов Bluemix.

Просматривая в Интернете, я нашел массу сообщений об ошибке: «read: Connection reset by peer», но похоже, что они не применяются к моему делу, или они связаны с брандмауэрами и конфигурационными файлами. У меня нет доступа в Bluemix. И, как я уже сказал, те же две команды, которые выполняются в моей операционной системе Linux, отлично работают.

Любая идея или рекомендация, чтобы заставить ее работать? Кто-нибудь тестировал эту идею раньше в Bluemix?

Спасибо!

+0

Ничего не распечатано с помощью 'printStackTrace()'? –

+0

Нет, потому что нет ошибки Java. Команда выполняется «правильно» с точки зрения Java и возвращает код выхода 1. Вот и все. –

+0

Я только что обнаружил p.getErrorStream(), чтобы получить ошибки консоли, а не только обычный вывод консоли. Проблема заключается в следующем: fusermount: option allow_other разрешен только в том случае, если в файле /etc/fuse.conf задано 'user_allow_other', поэтому у меня есть новая область исследования. Я отправлю обратно с выводами. –

ответ

3

ОК, наконец, я нашел причину проблемы с помощью коллег по команде. Проблема заключалась в разрешении частного ключа ssh. Он должен быть 600, и по умолчанию он был 644 после cf push.

Так вот окончательный код (быстрая и грязная), которая работала, только в случае, если это может быть полезным для других ...

  1. Включить в приложение закрытый ключ и файлы known_hosts.

  2. Нажмите приложение, добавив параметр -s cflinuxfs2.

  3. Выполнить при запуске во время выполнения какой-то код, как это:

    String s = null; 
    Process p = null; 
    BufferedReader br = null; 
    try 
    { 
        p = Runtime.getRuntime().exec("mkdir -p /home/vcap/misc"); 
        br = new BufferedReader(new InputStreamReader(p.getInputStream())); 
        while((s = br.readLine()) != null) 
         System.out.println("line: " + s); 
        p.waitFor(); 
        System.out.println ("#### Executing command mkdir with exit: " + p.exitValue()); 
        p.destroy(); 
        br.close(); 
    
        p = Runtime.getRuntime().exec("chmod 600 /home/vcap/app/wlp/usr/servers/defaultServer/apps/myapp.ear/cloud.key"); 
        br = new BufferedReader(new InputStreamReader(p.getInputStream())); 
        while((s = br.readLine()) != null) 
         System.out.println("line: " + s); 
        p.waitFor(); 
        System.out.println ("#### Executing command chmod with exit: " + p.exitValue()); 
        p.destroy(); 
        br.close(); 
    
        p = Runtime.getRuntime().exec("chmod 600 /home/vcap/app/wlp/usr/servers/defaultServer/apps/myapp.ear/known_hosts"); 
        br = new BufferedReader(new InputStreamReader(p.getInputStream())); 
        while((s = br.readLine()) != null) 
         System.out.println("line: " + s); 
        p.waitFor(); 
        System.out.println ("#### Executing command chmod with exit: " + p.exitValue()); 
        p.destroy(); 
        br.close(); 
    
        p = Runtime.getRuntime().exec("sshfs [email protected]:/home/ibmcloud /home/vcap/misc -o IdentityFile=/home/vcap/app/wlp/usr/servers/defaultServer/apps/myapp.ear/cloud.key -o StrictHostKeyChecking=yes -o UserKnownHostsFile=/home/vcap/app/wlp/usr/servers/defaultServer/apps/myapp.ear/known_hosts -o idmap=user -o compression=no -o sshfs_debug"); 
        br = new BufferedReader(new InputStreamReader(p.getInputStream())); 
        while((s = br.readLine()) != null) 
         System.out.println("line: " + s); 
        p.waitFor(); 
        System.out.println ("#### Executing command sshfs with exit: " + p.exitValue()); 
        p.destroy(); 
        br.close(); 
    
        p = Runtime.getRuntime().exec("ls -l /home/vcap/misc"); 
        br = new BufferedReader(new InputStreamReader(p.getInputStream())); 
        while((s = br.readLine()) != null) 
         System.out.println("line: " + s); 
        p.waitFor(); 
        System.out.println ("#### Executing command ls with exit: " + p.exitValue()); 
        p.destroy(); 
        br.close(); 
    } 
    catch(IOException ex) 
    { 
        ex.printStackTrace(); 
    } 
    catch(InterruptedException ex) 
    { 
        ex.printStackTrace(); 
    } 
    finally 
    { 
        try 
        { 
         if(br != null) 
          br.close(); 
        } 
        catch(IOException ex) 
        { 
         ex.printStackTrace(); 
        } 
    } 
    

    Этот фрагмент кода необходимо создать папку, смонтировать удаленную файловую систему в эту папку и список содержимого удаленной файловой системы.