web-dev-qa-db-ja.com

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

コピーしたいsquid.confあるサーバーから別のサーバーへ。

  • サーバーは互いに通信しません。ワークステーションを確認したいのですが。
  • 両方のサーバーにファイルがあるため、ターゲット上で上書きされます。
  • ファイルには600権限があり、rootが所有しています。
  • ssh経由のrootログインは無効です(PermitRootLogin no)。
  • 設定ガイドの一部になるので、なるべく一行でやりたいです。

私はすることを知っています

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パスワードを要求し、ファイルを宛先に転送するかがわからないことです。これは可能ですか?

[〜#〜] update [〜#〜]:これが私が思いつく最高のものです:

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'

これをワンライナーと呼ぶのは、ストレッチのようです。セットアップガイドの別の手順に分けて説明します。

13
itsadok

Sshをsshとチェーンする方が、sshをSudoとチェーンするよりも簡単です。したがって、sshサーバー構成の変更は問題ありません。各サーバーのrootのsshを開くことをお勧めしますが、localhostからのみです。これを行うには、sshd_configMatch句を使用します。

PermitRootLogin no
Match Host localhost
    PermitRootLogin yes

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

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

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

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

SshとSudoを使用すると、提案されたコマンドを簡略化できます。両側で、パスワードを再度尋ねないようにSudoを設定している場合は、一度Sudoを実行してパスワードの要件を克服し、もう一度ファイルをコピーすることができます。 (パスワードプロンプトが邪魔になるため、ファイルを直接簡単にコピーすることはできません。)

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を持っているのでなければ、これを尋ねることはないでしょう。

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

ソース:

user    ALL=NOPASSWD:/bin/cat

目標通り:

user    ALL=NOPASSWD:/usr/bin/tee

そしてyurマシンで行います:

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

しかし、私は puppet のようなものを使用することをお勧めします。設定ファイルの配布により、問題がはるかに改善され、簡単に解決されます。

PS。ちなみに、ユーザーからパスワードを要求するようにSudoを設定する場合は、[Sudo] password for userはターゲットファイルに表示されます。

4
rush

Ssh構成を変更せずに、server2へのssh接続を介して2つのsshトンネルHost-> server1およびserver2-> Hostを作成できます。これら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-書き込み用にターゲットマシンでルートとしてすべて実行

'Sudo bash -c "..."'

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

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つのパスワード要求を受け取る場合があります。ただし、ファイルは上書きされます。

2
Marco Aurelio

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

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

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

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

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

2
Mughil