ローカルファイルの提供中にJavaプログラムをリモートコマンドとして呼び出すために、Javaプログラム/シェルスクリプトの組み合わせをどのように作成できますか?

ローカルファイルの提供中にJavaプログラムをリモートコマンドとして呼び出すために、Javaプログラム/シェルスクリプトの組み合わせをどのように作成できますか?

これは以下に関連しています。リモートコマンドを実行し、ローカルファイルを入力に渡すには?

私はファイルの最初の行を印刷する単純なJavaプログラムを書いています。

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.OutputStreamWriter;

public class ReadFirstLine 
{
    public static void main(String[] args) throws Exception 
    {
       String filename = args[0];

       BufferedReader iR  = new BufferedReader (new FileReader(filename));
       BufferedWriter oW = new BufferedWriter(new OutputStreamWriter(System.out));

       outputWriter.write(iR.readLine());

       iR.close();
       oW.close();
    }
}

ReadFirstLineその後、/ usr / local / RFL / ReadFirstLineスクリプトと呼ばれる/ usr / binディレクトリにシンボリックリンクを作成しました。

#! /bin/bash

java -cp "/usr/local/RFL" ReadFirstLine "$1" 

(/usr/local/RFLにはReadFirstLine.classがあります)

これで、次のようにすべてのディレクトリからReadFirstLineを呼び出すことができます。

$ ReadFirstLine simplefile.txt

別のコンピュータで同じスクリプトを呼び出したいです。だからリモートコンピュータで試してみてください -

$ ssh username@xyz ReadFirstLine < localfile.txt  

しかし、エラーが発生しました。

Exception in thread "main" java.io.FileNotFoundException:  (No such file or directory)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(FileInputStream.java:146)
    at java.io.FileInputStream.<init>(FileInputStream.java:101)
    at java.io.FileReader.<init>(FileReader.java:58)
    at ReadFirstLine.main(ReadFirstLine.java:12)

このリモート呼び出しが機能するようにJavaプログラム/スクリプトを変更するにはどうすればよいですか?

答え1

私はJavaについて何も知りませんが、概念の証明を示すことができます。私たちがいると言うローカルファイル.txt:

Here is the local file.

私たちが持っているリモートコンピュータにリモート.sh:

#!/bin/bash
cat /dev/stdin

リモートコンピュータのスクリプトは、次のプログラムを呼び出します。次から読む stdin。その後、コンテンツを配信します。ローカルファイル.txtSSHコマンドで:

user@local:~$ cat localfile.txt | ssh user@remote remote.sh
Here is the local file.

Javaプログラムが読み取ろうとしています。文書ファイルがリモートコンピュータに存在しません。ローカルファイルを模倣してみることができると思います。

変化リモート.sh到着する:

#!/bin/bash
cat "$@"

そして電話してください

user@local:~$ cat localfile.txt | ssh user@remote 'remote.sh <(cat /dev/stdin)'
Here is the local file.

Javaプログラムでその部分をstdin

推測する次のような場合、状況が乱れる可能性があります。ローカルファイル.txtシェルで拡張可能と解釈できるすべての項目(例*:)を含めますが、これはユーザーが直接把握する必要があります。

答え2

問題は、シェルリダイレクト(<)がSSHトンネルを介してファイルを転送することです。 Javaクラスには、ファイルではなくFileReaderで読み取るローカルファイルの「ファイル名」を含む文字列が必要です。

ファイル名はFileReaderに渡されず、標準入力から読み取られます。

InputStreamReader isReader = new InputStreamReader(System.in);
BufferedReader iR  = new BufferedReader (isReader);

これを参考にしてください。 https://stackoverflow.com/questions/5724646/how-to-pipe-in​​put-to-java-program-with-bash

今、あなたのクラスは次のとおりです。

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.OutputStreamWriter;
import java.io.InputStreamReader;

public class ReadFirstLine 
{
    public static void main(String[] args) throws Exception 
    {
       String filename = args[0];
       System.out.println(filename);

       //BufferedReader iR  = new BufferedReader (new FileReader(filename));
       InputStreamReader isReader = new InputStreamReader(System.in);
       BufferedReader iR  = new BufferedReader (isReader);

       BufferedWriter oW = new BufferedWriter(new OutputStreamWriter(System.out));

       //outputWriter.write(iR.readLine());
       System.out.println(iR.readLine());

       iR.close();
       oW.close();
    }
}

ただし、この操作には必ず以下を使用してください。

head -1 filename.txt

:)

答え3

定義に応じて、ローカルファイルはローカルコンピュータにあります。 Javaプログラムはリモートコンピュータにあります。リモートシステムはローカルファイルについて知らず、どのプロダクション状況でもそのファイルを読み取る権限がない可能性があります。この状況に対する3つの一般的なアプローチを考えることができます。

1) ファイルの代わりに stdin から読み取るように Java プログラムを変更します。これで現在の構文が$ ssh username@xyz ReadFirstLine < localfile.txt機能します。

2)Javaプログラムを実行する前に、ローカルコンピュータからリモートコンピュータにファイルをscpします。 scp localfile.txt username@xyz Javaプログラムの作業ディレクトリに配置する必要があります。

3) リモートコンピュータにあるリモートディレクトリをローカルコンピュータにマウントします。これは必要な設定に最も近いソリューションです。これにより、ローカルでファイルを変更でき、リモートコンピュータに変更が表示されます。リモートディレクトリのマウントの詳細については、この回答を参照してください。

https://stackoverflow.com/questions/232269/how-to-mount-a-linux-directory-from-a- Different-pc-to-your-local-linux-pc

Javaプログラムの引数はパスです。リモートコンピュータに示すように

ローカルコンピュータで:/directory/which/has/been/shared/localfile.txt

リモートコンピュータから:/path/to/mounted/directory/on/remote/host/localfile.txt

$ ssh username@xyz ReadFirstLine < /path/to/mounted/directory/on/remote/host/localfile.txt

答え4

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.OutputStreamWriter;

public class ReadFirstLine 
{
    public static void main(String[] args) throws Exception 
    {
       String filename = args[0];

       BufferedReader iR  = new BufferedReader (new FileReader(filename));
       BufferedWriter oW = new BufferedWriter(new OutputStreamWriter(System.out));

       outputWriter.write(iR.readLine());

       iR.close();
       oW.close();
    }
}

関連情報