GNU/Linux >> Belajar Linux >  >> Linux

Ssh – Menyalin File yang Dilindungi Antar Server Dalam Satu Baris?

Saya ingin menyalin squid.conf dari satu server ke server lainnya.

  • Server tidak saling berbicara. Saya ingin memeriksa stasiun kerja saya.
  • Kedua server memiliki file tersebut, sehingga akan ditimpa pada target.
  • File memiliki 600 izin dan dimiliki oleh root.
  • login root melalui ssh dinonaktifkan (PermitRootLogin no ).
  • Saya ingin melakukannya dalam satu baris, jika memungkinkan, karena ini akan menjadi bagian dari panduan penyiapan.

Saya tahu harus melakukannya

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

untuk menyalin file antar server dan mempertahankan izin. Namun, dalam hal ini saya akan mendapatkan “Izin ditolak”.

Saya juga tahu saya bisa melakukan ini:

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

Dengan cara ini -t memungkinkan sudo untuk meminta kata sandi admin sebelum mengeluarkan konten file.

Masalahnya, saya tidak tahu bagaimana menggabungkan teknik-teknik itu menjadi sesuatu yang akan meminta kata sandi sudo di setiap server, dan mentransfer file ke tujuannya. Apakah ini mungkin?

PERBARUI :Ini yang terbaik yang bisa saya temukan:

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'

Menyebut ini one-liner sepertinya berlebihan. Saya rasa saya akan memecahnya menjadi langkah-langkah terpisah dalam panduan penyiapan.

Jawaban yang Diterima:

Lebih mudah untuk merantai ssh dengan ssh daripada merantai ssh dengan sudo. Jadi mengubah konfigurasi server ssh tidak masalah, saya sarankan membuka ssh untuk root setiap server, tetapi hanya dari localhost. Anda dapat melakukannya dengan Match klausa di sshd_config :

PermitRootLogin no
Match Host localhost
    PermitRootLogin yes

Kemudian Anda dapat mengatur rantai otentikasi berbasis kunci dari pengguna jarak jauh ke pengguna lokal dan dari pengguna lokal ke root. Anda masih memiliki jejak autentikasi sehingga log Anda memberi tahu Anda siapa yang masuk sebagai root, dan langkah autentikasinya sama seperti jika sudo terlibat.

Untuk terhubung ke server sebagai root, tentukan alias di ~/.ssh/config seperti ini:

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

Jika Anda bersikeras menggunakan sudo , saya yakin Anda memerlukan perintah terpisah, seperti sudo bersikeras membaca dari terminal (meskipun memiliki tiket untuk akun Anda)¹, dan tidak ada metode penyalinan file biasa (scp, sftp, rsync) yang mendukung interaksi dengan terminal jarak jauh.

Terkait:cara untuk menentukan bagian dari pipa benar-benar "melewati"?

Tetap menggunakan ssh dan Sudo, perintah yang Anda usulkan dapat disederhanakan. Di setiap sisi, jika Anda telah mengatur sudo untuk tidak meminta kata sandi lagi, Anda dapat menjalankannya sekali untuk menyelesaikan persyaratan kata sandi dan di lain waktu untuk menyalin file. (Anda tidak dapat dengan mudah menyalin file secara langsung karena permintaan kata sandi menghalangi.)

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'

kecuali Anda memiliki NOPASSWD , tetapi Anda tidak akan menanyakan ini.


Linux
  1. Cetak Dua File Dalam Dua Kolom?

  2. Mempercepat Penyalinan 1000000 File Kecil?

  3. Garis Umum Antara Dua File?

  1. Kondisi Satu Baris Check In Makefile?

  2. Server FTP Satu Jalur

  3. Menggabungkan File Dan Menyisipkan Baris Baru Di Antara File

  1. Cara Mentransfer File Antar Server di Linux menggunakan SCP dan FTP

  2. Gunakan perangkat melalui SSH?

  3. Bagaimana cara berbagi aset antara beberapa server web?