コピーしたいsquid.conf
あるサーバーから別のサーバーへ。
600
権限があり、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'
これをワンライナーと呼ぶのは、ストレッチのようです。セットアップガイドの別の手順に分けて説明します。
Sshをsshとチェーンする方が、sshをSudoとチェーンするよりも簡単です。したがって、sshサーバー構成の変更は問題ありません。各サーバーのrootのsshを開くことをお勧めしますが、localhostからのみです。これを行うには、sshd_config
のMatch
句を使用します。
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
はターゲットファイルに表示されます。
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つのパスワード要求を受け取る場合があります。ただし、ファイルは上書きされます。
Sshを使用する代わりに、scpを使用してサーバー間でファイルを転送できます。
ターゲットサーバーにログインします。
ファイルをコピーするターゲットディレクトリに変更します。
#scp -r -p -P 22 root@source-ipaddress:/source-path-file-to-copy .
r-再帰的p-元のファイルの変更時間、アクセス時間、モードを保持します