bagaimana menjalankan dua perintah dalam sudo?

152

Apakah ada cara bagaimana saya bisa menjalankan dua perintah Db2 dari baris perintah? (Mereka akan dipanggil dari execperintah PHP .)

  1. db2 connect to ttt (perhatikan bahwa kita perlu memiliki koneksi langsung untuk perintah kedua
  2. db2 UPDATE CONTACT SET EMAIL_ADDRESS = '[email protected]'

Saya mencoba ini:

sudo -su db2inst1 db2 connect to ttt; db2 UPDATE CONTACT SET EMAIL_ADDRESS = '[email protected]'

Perintah pertama selesai dengan benar tetapi yang kedua gagal dengan pesan kesalahan SQL1024N A database connection does not exist. SQLSTATE=08003

Perhatikan bahwa saya perlu menjalankan ini sebagai pengguna php. Perintah sudo -u db2inst1 idsebagai pengguna php memberi saya hasil yang benar.

Radek
sumber
silakan tinggalkan komentar mengapa Anda ingin menutup pertanyaan ini. Terima kasih.
Radek
1
Suara penutupan adalah untuk migrasi ke serverfault, karena ini adalah pertanyaan administrasi sistem, bukan pemrograman.
bdonlan

Jawaban:

157

sudo dapat menjalankan banyak perintah melalui shell, misalnya:

$ sudo -s - 'whoami; siapa saya'
akar
akar

Perintah Anda akan menjadi seperti:

sudo -u db2inst1 -s - "db2 sambungkan ke ttt; db2 SET KONTAK PEMBARUAN BARU EMAIL_ADDRESS = '[email protected]'"

Jika versi sudo Anda tidak berfungsi dengan titik koma dengan -s (tampaknya, itu tidak jika dikompilasi dengan opsi tertentu), Anda dapat menggunakan

sudo - sh -c 'whoami; siapa saya'

sebagai gantinya, yang pada dasarnya melakukan hal yang sama tetapi membuat Anda memberi nama shell secara eksplisit.

wjl
sumber
12
ini tidak berfungsi pada pesta debian stable (squeeze) terbaru:sudo -s -- '/usr/bin/whoami; /usr/bin/whoami' /bin/bash: /usr/bin/whoami; /usr/bin/whoami: No such file or directory
Valor
11
@Valor dapat Anda gunakan sudo -- sh -c 'whoami; whoami;sebagai solusi saat "sudo -s" rusak. Saya sudah memperbarui jawabannya juga.
wjl
6
+1 untuk versi yang diedit yang menunjukkan contoh "- sh -c". Terima kasih!
JD.
4
Bisakah Anda jelaskan mengapa Anda perlu "-"?
Vic Seedoubleyew
7
@VicSeedoubleyew --Menunjukkan akhir parameter sudo, jadi yang lainnya adalah bagian dari perintah; tanpa itu, argumen seperti -cbisa diartikan sebagai argumen sudo. Ini berfungsi untuk sebagian besar (tetapi tidak semua) program baris perintah. Untuk sudocontoh (non- ) lainnya, untuk menghapus file yang disebut -fAnda tidak bisa dijalankan rm -f, bukan ?! Tetapi Anda dapat menjalankan rm -- -funtuk menghapus file yang disebut -f.
wjl
176

Untuk perintah Anda, Anda juga dapat merujuk pada contoh berikut:

sudo sh -c 'whoami; whoami'

Jason
sumber
14
Saya telah menemukan ini alternatif yang lebih dapat diandalkan.
Nick
44

Saya biasanya melakukan:

sudo bash -c 'whoami; whoami'
Samer Atiani
sumber
42

Jika Anda ingin menangani penawaran:

sudo -s -- <<EOF
id
pwd
echo "Done."
EOF
Nebojša
sumber
4
Ini jawaban terbersih di sini, terima kasih. Mungkin menambahkan catatan "Anda tidak dapat menjalankan beberapa perintah dari sudo- Anda selalu perlu mengelabuinya untuk mengeksekusi shell yang dapat menerima beberapa perintah untuk dijalankan sebagai parameter"
trs
8

Alternatif penggunaan evalsehingga menghindari penggunaan subkulit:

sudo -s eval 'whoami; whoami'

Catatan: Jawaban lain menggunakan sudo -sgagal karena tanda kutip diteruskan ke bash dan dijalankan sebagai satu perintah sehingga perlu menghapus tanda kutip dengan eval. evallebih baik dijelaskan adalah jawaban SO ini

Mengutip dalam perintah juga lebih mudah:

$ sudo -s eval 'whoami; whoami; echo "end;"'
root
root
end;

Dan jika perintah perlu berhenti berjalan jika gagal menggunakan double-ampersand bukan semi-titik dua:

$ sudo -s eval 'whoami && whoamit && echo "end;"'
root
/bin/bash: whoamit: command not found
Cas
sumber
3

The -spilihan tidak bekerja untuk saya, -ilakukan.

Berikut adalah contoh bagaimana saya dapat memperbarui ukuran log dari bash saya:

sudo -u [user] -i -- sh -c 'db2 connect to [database name];db2 update db cfg for [database name] using logsecond 20;db2 update db cfg for [database name] using logprimary 20;'
pengguna2597485
sumber
1

Di terminal, ketik:

$ sudo bash

Kemudian tulis sebanyak mungkin perintah yang Anda inginkan. Tipeexit saat Anda selesai.

Jika Anda perlu mengotomatiskannya, buat script.shfile dan jalankan:

$ sudo ./script.sh
Moshe Simantov
sumber
1

Pada topik yang sedikit terkait, saya ingin melakukan sudo multi-perintah yang sama melalui SSH tetapi tidak ada yang berhasil.

Misalnya di Ubuntu,

$ ssh host.name sudo sh -c "whoami; whoami"
[sudo] password for ubuntu:
root
ubuntu

Trik yang ditemukan di sini adalah dengan mengutip dua kali perintah.

$ ssh host.name sudo sh -c '"whoami; whoami"'
[sudo] password for ubuntu:
root
root

Opsi lain yang juga berfungsi:

ssh host.name sudo sh -c "\"whoami; whoami\""
ssh host.name 'sudo sh -c "whoami; whoami"'

Pada prinsipnya, tanda kutip ganda diperlukan karena saya pikir shell klien tempat SSH dijalankan menghapus set tanda kutip yang paling luar. Campur dan sesuaikan kutipan dengan kebutuhan Anda (mis. Variabel harus dimasukkan) Namun YMMV dengan tanda kutip terutama jika perintah jarak jauh kompleks. Dalam hal ini, alat seperti Ansible akan membuat pilihan yang lebih baik.

Eugene Chow
sumber
1

Jika Anda tahu kata sandi root, Anda dapat mencoba

su -c "<command1> ; <command2>"  
pecahan
sumber
Jika Anda tidak tahu kata sandi root, gunakan sudo su -c "<command1> ; <command2>" .
Dag Høidahl
0

Jawaban di atas tidak akan membiarkan Anda mengutip di dalam kutipan. Solusi ini akan:

sudo -su nobody umask 0000 \; mkdir -p "$targetdir"

Perintah umask dan mkdir-command berjalan dengan pengguna 'tidak ada'.

Arberg
sumber
Anda dapat menggunakan tanda kutip tunggal dan ganda dan menghindarinya.
Radek
Ok, jadi bagaimana bisa, sekarang apa pun yang saya atur umask di perintah ini, itu tidak berpengaruh?
Michael