2016-08-23 6 views
-1

PC2上のC++プログラムで、PC2のホスト名を指定してPC2上で別のプログラムを起動したいと考えています。私は実際には今複雑にしたくないので、プログラムがPC2上の実行ファイルの検索パス上にあると仮定しよう。私が理解していることから、これは何とかsshで行うことができますか? PC1とPC2の両方にアカウントを持っているので、PC1にログインしている場合(ユーザー名とパスワードを入力する必要はありません)、sshは私に接続しますこれをやってみようか? https://www.libssh.org/は物事を簡素化するのに役立つでしょうか?C++コードから別のコンピュータでプログラムを実行するには?

+0

CLIから手動で行う方法はわかりますか?シェルコマンドを実行するために、同じコマンドを 'system()'呼び出しに入れてください。 – Barmar

答えて

1

sshを使用してリモートコマンドを実行するコマンドラインを構築します。次に、system()を使用してそのコマンドを実行します。

std::string pc2_hostname; 
std::string cmd = "ssh " + pc2_hostname + " command_to_execute"; 
system(cmd.c_str()); 
+0

私は参照してください。私はこのソリューションを使用したが、私はユーザー名/パスワードを供給する必要があることが判明したらどうなりますか?プログラムがsystem()を呼び出した後、sshがユーザとやりとりしようとしているかどうか調べることはできますか?私はそれがOPで必要とされないと特別に言ったことを知っているので、これはちょっとしたボーナス問題です。 – TheMountainThatCodes

+0

パスワードなしのSSHを設定する必要があります。パスワードが必要な場合は、ユーザーに確認を求めます。 – Barmar

+0

SSHにパスワードが必要な場合にプログラムがエラーを表示する方法はありますか? – TheMountainThatCodes

3

あなたはこのC++ RPCライブラリにより興味があるかもしれない:

http://szelei.me/introducing-rpclib

自分の例から、リモートコンピュータ上:ローカルコンピュータで

#include <iostream> 
#include "rpc/server.h" 

void foo() { 
    std::cout << "foo was called!" << std::endl; 
} 

int main(int argc, char *argv[]) { 
    // Creating a server that listens on port 8080 
    rpc::server srv(8080); 

    // Binding the name "foo" to free function foo. 
    // note: the signature is automatically captured 
    srv.bind("foo", &foo); 

    // Binding a lambda function to the name "add". 
    srv.bind("add", [](int a, int b) { 
     return a + b; 
    }); 

    // Run the server loop. 
    srv.run(); 

    return 0; 
} 

#include <iostream> 
#include "rpc/client.h" 

int main() { 
    // Creating a client that connects to the localhost on port 8080 
    rpc::client client("127.0.0.1", 8080); 

    // Calling a function with paramters and converting the result to int 
    auto result = client.call("add", 2, 3).as<int>(); 
    std::cout << "The result is: " << result << std::endl; 
    return 0; 
} 

絶対に何かを実行するには、リモートコンピュータ上で「システム」コールを行うことができます。だから、サーバー側で持っている:

// Binding a lambda function to the name "add". 
    srv.bind("system", [](char const * command) { 
     return system(command); 
    }); 

そして今、あなたは、クライアント側で:

明らか
auto result = client.call("system", "ls").as<int>(); 

、あなたは、このようなライブラリを使用する場合は、セキュリティを考える必要があります。これは信頼できるLAN環境でうまくいくでしょう。インターネットのような公衆ネットワークでは、それほど良い考えではないかもしれません。

関連する問題