保護されたファイルをサーバー間で1行でコピーしますか?


13

squid.confあるサーバーから別のサーバーにコピーしたいと思います。

  • サーバーは互いに通信しません。ワークステーションを通過したいのですが。
  • 両方のサーバーにファイルがあるため、ターゲット上で上書きされます。
  • ファイルには600権限があり、rootが所有しています。
  • sshを介したルートログインは無効です(PermitRootLogin no)。
  • セットアップガイドの一部になるため、可能であれば1行で行いたいと思います。

することを知っている

ssh source 'tar czpf - -C /etc/squid/ squid.conf' | \
    ssh target 'tar xzpf - -C /etc/squid/'

サーバー間でファイルをコピーし、権限を保持します。ただし、この場合、「許可が拒否されました」というメッセージが表示されます。

私もこれができることを知っています:

ssh -t source 'sudo cat /etc/squid/squid.conf'

この方法-tにより、sudoはファイルのコンテンツを出力する前に管理者パスワードを要求できます。

問題は、これらの技術を組み合わせて、各サーバーでsudoパスワードを要求し、そのファイルを宛先に転送する方法を理解していないことです。これは可能ですか?

更新:ここに私が思いつく最高のものがあります:

ssh -t source 'sudo tar czf /tmp/squid.tgz -C /etc/squid squid.conf' && \
ssh source 'cat /tmp/squid.tgz' | \
    ssh target 'cat >/tmp/squid.tgz' && \
ssh -t source 'sudo rm /tmp/squid.tgz' && \
ssh -t target \
    'sudo tar xzf /tmp/squid.tgz -C /etc/squid && sudo rm /tmp/squid.tgz'

これをワンライナーと呼ぶのは一見ストレッチのようです。セットアップガイドで別の手順に分割するだけだと思います。


回答:


11

sshをsshにチェーンするよりも、sshをsshにチェーンする方が簡単です。sshサーバーの設定を変更しても大丈夫です。各サーバーのルートに対してsshを開くことをお勧めしますが、ローカルホストからのみです。これは、次のMatch句を使用して実行できますsshd_config

PermitRootLogin no
Match Host localhost
    PermitRootLogin yes

次に、リモートユーザーからローカルユーザーへ、およびローカルユーザーからルートへのキーベースの認証チェーンを設定できます。認証トレイルが残っているため、ログにルートとしてログインしたユーザーが示され、認証手順はsudoが関係した場合と同じです。

ルートとしてサーバーに接続するには、次の~/.ssh/configようにエイリアスを定義します。

Host server-root
HostName server.example.com
User root
ProxyCommand "ssh server.example.com nc %h %p"

を使用することを主張する場合、端末からの読み取りを要求するため(アカウントのチケットがある場合でも)¹、通常のファイルコピー方法(scp、sftp、rsync)のいずれもsudo必要としないため、個別のコマンドが必要になると思いますsudoリモート端末との対話をサポートします。

sshとsudoに固執すると、提案されたコマンドを簡素化できます。どちらの側でも、sudoが再度パスワードを要求しないように設定している場合は、一度実行してパスワード要件を処理し、もう1回ファイルをコピーできます。(パスワードプロンプトが邪魔になるため、ファイルを直接簡単にコピーすることはできません。)

ssh -t source 'sudo true'
ssh -t target 'sudo true'
ssh -t source 'sudo cat squid.conf' |
ssh -t target 'sudo tee /etc/squid/squid.conf'

¹ を持っている場合を除きNOPASSWD、しかし、あなたはこれを求めないでしょう。


最初の解決策は私にとってはうまくいきましたが、2番目の行はうまくいくはずですMatch host localhost
cduck

4

sudo次の方法でパスワードを要求しないように設定できます。

ソースで:

user    ALL=NOPASSWD:/bin/cat

ターゲットに:

user    ALL=NOPASSWD:/usr/bin/tee

そして、あなたのマシンで行います:

ssh source 'sudo cat /test' | ssh target 'sudo tee /test'

しかし、人形のようなものを使用することをお勧めします。構成ファイルの配布に関する問題をはるかに改善し、簡単に解決できます。

PS。ちなみに、sudoユーザーにパスワードを要求するように設定すると、文字列[sudo] password for userがターゲットファイルに表示されます。


人形を提案するための+1ですが、ソリューションは安全ではないようです。ルートとしてのログインを許可することもできます。
itsadok

2

sshを使用する代わりに、scpを使用してサーバー間でファイルを転送できます。

ターゲットサーバーにログインします。

ファイルをコピーするターゲットディレクトリに変更します。

#scp -r -p -P 22 root@source-ipaddress:/source-path-file-to-copy .

r-再帰p-元のファイルの変更時間、アクセス時間、モードを保持します


これは、ルートとしてログインできることを前提としていますが、これはできません。質問を更新します。
itsadok

2

ssh構成を変更せずに、server2へのssh接続を介して、host-> server1およびserver2-> hostの2つのsshトンネルを作成できます。ホストマシンでこれら2つのトンネルを接続します(同じポート)。そして、server2でsudoを実行して、server1の接続されたトンネルからデータを取得し、server2に保存します。

ssh -L60000:${source}:22 -R60000:localhost:60000 -t ${target} 'sudo bash -c "ssh -p 60000 '$(whoami)'@localhost \"cd /path/to/dir; tar -czf - files\"|tar -C/path/to/target -xzf -"'

アイデアは次のとおりです。1-ポート60000でマシンからソースマシンへのローカルトンネルを作成する

ssh -L60000:${source}:22

1b-マシンに戻るためのリモートトンネルを作成する

-R60000:localhost:60000

2-ターゲットマシンに接続

-t ${target}

3-書き込みのためにターゲットマシンですべてrootとして実行

'sudo bash -c "..."'

4-トンネルを介してソースマシンに接続します。whoamiおよびlocalhostは、$ {target}マシン上のlocalhostを意味します。

ssh -p 60000 '$(whoami)'@localhost

5-リモートファイルをパッケージ化し、zip圧縮してstdoutに送信する

cd /path/to/dir; tar -czf - file

6- stdoutを介してパッケージを受け取り、それに応じて/ path / to / targetディレクトリでファイルを抽出します

|tar -C/path/to/target -xzf -

注:最大3つのsshkey確認と3つのパスワード要求を受け取ることがあります。ただし、ファイルはコピーされます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.