2

次の C プログラムは、「/Users/home/tempdir」ディレクトリのディレクトリ リストをコンパイルして吐き出します。

#include <stdio.h>
#include <unistd.h>
int main(int argc, const char * argv[])
{
        execl("/bin/ls", "ls", "/Users/home/tempdir");
        // execl("/usr/bin/scp", "scp", "myfile.txt home@127.0.0.1:/Users/home/scpdir");
    return 0;
}

これは、C プログラムからバイナリ ファイルを実行できることを示しています。「scp」バイナリファイルを実行し、必要なパスフレーズを入力する方法を見つけようとしています。上記のコードを変更して、 scp 経由でファイル転送を成功させるにはどうすればよいですか?

上記のコメントアウトされた行を試しましたが、コメントを外すと次のメッセージが表示されます。

usage: scp [-1246BCEpqrv] [-c cipher] [-F ssh_config] [-i identity_file]
           [-l limit] [-o ssh_option] [-P port] [-S program]
           [[user@]host1:]file1 ... [[user@]host2:]file2

したがって、明らかにパスワードなしで scp を実行しようとしています。どうすればこれを回避できますか?

4

5 に答える 5

1

短い答えですが、通常、この方法でインタラクティブなアプリケーションを自動化するには、Expectのようなものを使用します。

于 2013-09-22T17:46:21.533 に答える
0

あなたが印刷している出力は、間違ったコマンド構文からのものであるように私には思えます。execl のマニュアルページによると (少なくとも Arch Linux では):

execl()、execlp()、および execle() 関数内の const char *arg とそれに続く省略記号は、arg0、arg1、...、argn と考えることができます。

したがって、それを呼び出す正しい方法は次のようになります。

execl("/usr/bin/scp", "scp", "myfile.txt", "home@127.0.0.1:/Users/home/scpdir");

また、パスワードを完全に入力する必要がないようにしたい場合は、パスワードをバイパスする「承認済みキー」を使用して SSH (scp がその上に構築されている) を構成できます。ただし、未知の鍵のフィンガープリントについて尋ねる場合があります。パスワードなしの scp アクセスを設定する簡単な方法は、(scp を開始するコンピューターから) 次を実行することです。

ssh-copy-id home@127.0.0.1

上記のコマンドはパスワードを 1 回要求しますが、その後の ssh 操作で再度パスワードを入力する必要はありません。

于 2013-09-23T19:57:51.773 に答える