Saya ingin menyalin squid.conf
dari satu server ke yang lain.
- Server tidak berbicara satu sama lain. Saya ingin melewati workstation saya.
- Kedua server memiliki file, sehingga akan ditimpa pada target.
- File-file tersebut 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 pengaturan.
Saya tahu harus melakukan
ssh source 'tar czpf - -C /etc/squid/ squid.conf' | \
ssh target 'tar xzpf - -C /etc/squid/'
untuk menyalin file antara 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
sudo memungkinkan untuk meminta kata sandi admin sebelum mengeluarkan konten file.
Masalahnya adalah, saya tidak tahu bagaimana menggabungkan teknik-teknik itu menjadi sesuatu yang akan meminta kata sandi sudo pada setiap server, dan mentransfer file ke tujuannya. Apakah ini mungkin?
UPDATE : Ini yang terbaik yang bisa saya pikirkan:
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 tampak seperti peregangan. Saya pikir saya hanya akan memecahnya menjadi langkah-langkah terpisah dalam panduan pengaturan.
ssh
sudo
file-transfer
itsadok
sumber
sumber
Jawaban:
Lebih mudah untuk rantai ssh dengan ssh daripada rantai ssh dengan sudo. Jadi mengubah konfigurasi server ssh ok, saya sarankan membuka ssh untuk root dari setiap server, tetapi hanya dari localhost. Anda dapat melakukan ini dengan
Match
klausa disshd_config
: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 otentikasi sehingga log Anda memberi tahu Anda siapa yang login sebagai root, dan langkah-langkah otentikasi sama seperti jika sudo terlibat.
Untuk terhubung ke server sebagai root, tentukan alias di
~/.ssh/config
seperti ini:Jika Anda bersikeras menggunakan
sudo
, saya yakin Anda akan memerlukan perintah terpisah, karenasudo
bersikeras untuk membaca dari terminal (bahkan jika itu memiliki tiket untuk akun Anda) ¹, dan tidak ada metode penyalinan file yang biasa (scp, sftp, rsync) dukungan berinteraksi dengan terminal jarak jauh.Tetap menggunakan ssh dan sudo, perintah yang Anda ajukan 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 waktu lain untuk menyalin file. (Anda tidak dapat dengan mudah menyalin file secara langsung karena prompt kata sandi menghalangi.)
¹ kecuali kamu punya
NOPASSWD
, tapi kamu tidak akan menanyakan ini.sumber
Match host localhost
.Anda dapat mengatur
sudo
untuk tidak meminta kata sandi dengan cara berikutnya:Sumber:
Sesuai target:
Dan lakukan pada mesin Anda:
Tapi saya sarankan untuk menggunakan sesuatu seperti boneka . Ini jauh lebih baik dan lebih mudah menyelesaikan masalah Anda dengan distribusi file konfigurasi.
PS. Omong-omong, jika Anda akan mengatur
sudo
untuk meminta kata sandi dari pengguna, string dengan[sudo] password for user
akan muncul di file target.sumber
Alih-alih menggunakan ssh, Anda dapat menggunakan scp untuk mentransfer file antara server.
Masuk ke server target:
Ubah ke direktori target tempat Anda ingin menyalin file.
r - rekursif p - Mempertahankan waktu modifikasi, waktu akses, dan mode dari file asli
sumber
Tanpa mengubah konfigurasi ssh, Anda dapat membuat dua terowongan ssh host-> server1 dan server2-> host melalui koneksi ssh ke server2. Hubungkan kedua terowongan ini pada mesin host (port yang sama). Dan jalankan sudo di server2 untuk mengambil data dari terowongan yang terhubung di server1 dan menyimpannya di server2.
Idenya adalah: 1- untuk membuat terowongan lokal dari mesin Anda ke mesin sumber pada port 60000
1b- Buat terowongan jarak jauh untuk mencapai kembali ke mesin Anda
2- terhubung ke mesin target
3 - jalankan semua sebagai root pada mesin target untuk menulis
4- terhubung ke mesin sumber melalui terowongan. whoami dan localhost berarti localhost pada mesin $ {target}.
5- mengemas file jarak jauh dan mengirimnya zip ke stdout
6- menerima paket melalui stdout dan mengekstrak file sesuai pada direktori / path / ke / target
Catatan: Anda dapat menerima hingga 3 konfirmasi tombol dan 3 permintaan kata sandi. Tetapi file akan disalin.
sumber