これは以下に関連しています。リモートコマンドを実行し、ローカルファイルを入力に渡すには?
私はファイルの最初の行を印刷する単純な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シェルで拡張可能と解釈できるすべての項目(例*
:)を含めますが、これはユーザーが直接把握する必要があります。