Adakah yang bisa menjelaskan mengapa sudo dengan wildcard tidak berfungsi?

16
$ sudo -iu abc ls -ltr /sites/servers/server_instance/logs/access*
ls: cannot access /sites/servers/server_instance/logs/access*: No such file or directory

$ sudo -iu abc ls -ltr /sites/servers/server_instance/logs/
total 594812
-rwxrwxrwx 1 abc abc      45 Mar 21 12:42 old.log
-rwxrwxrwx 1 abc abc      304537970 Mar 24 12:45 console.log
-rwxrwxrwx 1 abc abc      304537970 Mar 24 13:20 access_nginx.log

Adakah yang bisa menjelaskan mengapa ini terjadi? Saya terjebak pada skrip karena ini.

Faisal
sumber

Jawaban:

29

Satu kemungkinan adalah bahwa Anda tidak memiliki izin untuk mengakses satu atau lebih direktori di jalur itu ( /sites/servers/server_instance/logs). Ekspansi wildcard dilakukan oleh shell Anda, dan kemudian jalur yang diperluas diteruskan ke sudoperintah.

Jika pengguna Anda tidak memiliki izin, ekspansi tidak akan berfungsi di perintah pertama. Ini akan dijalankan apa adanya ( ls -ltr /sites/servers/server_instance/logs/access*), dan tidak ada file yang dinamai secara literal access*). Jika abcmemang memiliki izin yang diperlukan untuk semua direktori di jalan, perintah kedua, yang tidak memiliki wildcard, tidak akan disentuh oleh shell Anda, dan itu akan berfungsi dengan baik.

$ sudo namei -lx foo/bar/baz
f: foo/bar/baz
drwxr-xr-x muru    muru    foo
drwx------ test    test    bar
drwxr-xr-x muru    muru    baz

$ sudo ls foo/bar/b*
ls: cannot access 'foo/bar/b*': No such file or directory

$ sudo -u test ls foo/bar/
baz
muru
sumber
Terima kasih Muru, pendapat Anda benar, saya mengubah izin menjadi 755 dan sekarang berfungsi dengan baik.
Faisal
3
@ Faisal: Saya akan berpikir bahwa mengubah izin bukan obat yang tepat, meskipun itu mengungkapkan bahwa diagnosisnya benar. Obat yang tepat tampaknya adalah tidak melakukan globbing saat menyiapkan perintah sudo, melainkan menekannya di sini (dengan mengutip argumen path), meneruskan argumen apa adanya ke lsperintah yang dapat saat itu (ketika identitas berubah dari sutelah diambil efek) melakukan globbing.
Marc van Leeuwen
2
@MarcvanLeeuwen lstidak melakukan globbing apa pun.
muru
3
Anda dapat membuat globbing terjadi di lingkungan sudo dengan menambahkan sh -cke baris perintah.
Stig Hemmer
@ Faisal jika itu menjawab pertanyaan Anda, pertimbangkan untuk menerimanya ...
clem steredenn
7

Anda mungkin menonaktifkan globbing.

Cari sesuatu seperti set -fatau set -o noglobsebelum baris-baris dalam skrip, atau jika dalam menjalankan shell interaktif echo $-; jika ada fdalam output, globbing dinonaktifkan:

$ echo $-
fhimBH

Untuk memperbaikinya, hapus set -fatau set -o noglobdari skrip, atau jika dalam menjalankan shell interaktif set +fatau set +o noglob:

$ set -f
$ echo $-
fhimBH
$ ls access*
ls: cannot access access*: No such file or directory
$ set +f
$ echo $-
himBH
$ ls access*
access
kos
sumber
Ya, saya sebagai pengguna pribadi saya tidak memiliki akses ke jalur itu. Dalam skrip saya akan menjadi pengguna saya (via ssh) dan menjalankan perintah itu melalui pengguna produksi. Apakah ada yang bisa dilakukan untuk ini? (Satu hal yang perlu dicatat adalah saya tidak perlu memberikan kata sandi untuk berpindah pengguna)
Faisal
@ Faisal Bagaimana menjalankan skrip sebagai target pengguna ( sudo -u abc /path/to/script)? Dalam hal ini globbing seharusnya tidak gagal. Bagaimanapun muru menyarankan masalah jalur dalam jawabannya, bukan aku. Anda harus mempertimbangkan untuk menerima jawabannya ( askubuntu.com/help/accepted-answer ).
kos
Sebenarnya saya menjalankan itu di mesin remote melalui skrip sehingga -i akan diperlukan. Terima kasih juga untuk jawabannya.
Faisal