Bagaimana cara menjalankan perubahan pada server jauh sebagai root?

8

Saya bertanya-tanya apakah ada cara untuk menjalankan skrip / perintah dari mesin lokal tanpa membuat modifikasi apa pun sebagai root pada mesin remote?

Beberapa latar belakang

Saya mencoba mengatur beberapa tugas melalui Capistrano dan saya memerlukan sudoakses. Ada sekitar 30+ server dan bagi saya untuk memperbarui secara manual /etc/sudoersakan menyakitkan, jadi saya bertanya-tanya apakah ada metode untuk memperbarui file ini dari jarak jauh?

kaizenCoder
sumber
Anda dapat menggunakan Fabric yang memiliki interaksi jarak jauh. Anda dapat melakukan hal yang sama tanpa interaksi secara paralel menggunakan fabric.contrib.files.sedmetode.
lcipriani
Jika Anda memiliki 30 server yang Anda kelola, saya sangat merekomendasikan SaltStack
Wayne Werner

Jawaban:

18

Anda dapat menjalankan skrip lokal dari jarak jauh dengan mengeksekusi bashdi sistem jarak jauh dan mengumpankan skrip Anda

$ ssh user@host 'bash -s' < script.sh

Edit

Untuk menjalankan perintah yang mengharuskan penggunaan sudopada ssh's -topsi penggunaan mesin jarak jauh dan meneruskan perintah ke ssh. The -tpilihan mengalokasikan tty pseudo dan memungkinkan interaksi pengguna dengan perintah berlari oleh ssh, seperti memasukkan password untuksudo

$ ssh user@host -t 'sudo foo'

Untuk memodifikasi file menggunakan metode sedini disarankan melalui pengalihan >karena pengalihan shell tidak memungkinkan untuk menulis file saat menggunakan sudo. Selain itu, semua variabel dalam sedperintah harus diloloskan ketika mereka dilewatkan ke ssh.

$ ssh user@host -t 'sudo sed -i "\$a text to insert" /path/to/file'

Untuk mengotomatiskan semuanya:

#!/bin/bash
SERVERS=( server1 server2 server3 )

for HOST in ${SERVERS[@]}; do 
    ssh user@${HOST} -t 'sudo sed -i "\$a text to insert" /path/to/file'

    if [[ $? -ne 0 ]]; then
        echo "ERROR: $HOST did not complete"
     else   
        echo "$HOST complete"
    fi   
done
Sungai kecil
sumber
Terima kasih untuk skrip dan semua tetapi itu tidak benar-benar menjawab pertanyaan saya. Jika saya ingin memodifikasi /etc/sudoersfile karena izin root itu akan gagal.
kaizenCoder
@aspiringCodeArtisan lihat pengeditan untuk jawabannya
Creek
Hai, bahkan itu meminta sudokata sandi yang dari apa yang saya pahami diatur/etc/sudoers
kaizenCoder
1
@aspiringCodeArtisan Jika akun Anda tidak memiliki sudohak pada mesin ini, maka untuk memodifikasi /etc/sudoersAnda harus masuk melalui ssh as root. Jadi perintahnya adalahssh root@host -t 'sed -i "\$a text to insert" /path/to/file'
Creek
login root ssh dinonaktifkan secara default sehingga ini bukan pilihan. Saya pikir saya mungkin meminta yang tidak mungkin.
kaizenCoder
1

Saya menemukan teeperintah untuk membantu menghindari pembatasan sudo pada pengalihan file. Menggunakan sed terbukti membuat frustrasi karena persyaratan karakter yang lolos.

Ini adalah perintah yang saya gunakan untuk menambahkan remote host untuk semua mesin di cluster saya ke / etc / hosts:

for i in {1..10}; do ssh [email protected].$i -t "echo '10.1.1.1 dev-1    
10.1.1.4 dev-4
10.1.1.3 dev-3
10.1.1.2 dev-2
10.1.1.6 dev-6
10.1.1.8 dev-8
10.1.1.5 dev-5
10.1.1.10 dev-10
10.1.1.9 dev-9
10.1.1.7 dev-7' | sudo tee -a /etc/hosts >/dev/null"

Output untuk setiap iterasi terlihat seperti ini:

0+1 records in
0+1 records out
255 bytes (255 B) copied, 4.1338e-05 s, 6.2 MB/s

Jawaban SU ini sangat penting dalam membangun solusi akhir saya: https://superuser.com/a/1026359/587485

Garren
sumber
1

Jika Anda perlu menjalankan beberapa perintah atau arahan ulang, Anda harus menggunakan sintaks berikut:

ssh server.com "sudo sh -c 'ps aux | grep jav > /root/1.txt'"
air terjun sungai
sumber
0

Anda harus sudah memiliki semacam akses tingkat root, baik melalui root passwd langsung atau pengaturan sudo id pengguna Anda sebelum mencoba untuk memodifikasi file sudoers.

jag4701
sumber