Herkes bir joker ile sudo ls neden çalışmıyor açıklayabilir misiniz?


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

Herkes bunun neden olduğunu açıklayabilir mi? Bu yüzden bir senaryoda sıkıştım.

Yanıtlar:


29

Bir olasılık, bu yoldaki ( /sites/servers/server_instance/logs) bir veya daha fazla dizine erişim izninizin olmamasıdır . Joker karakter genişletmesi kabuğunuz tarafından yürütülür ve genişletilmiş yollar sudokomuta iletilir .

Kullanıcınızın izinleri yoksa, genişletme ilk komutta çalışmaz. Olduğu gibi çalıştırılır ( ls -ltr /sites/servers/server_instance/logs/access*) ve tam anlamıyla adlandırılmış bir dosya yoktur access*). Yoldaki abctüm dizinler için gerekli izinlere sahipse , herhangi bir joker karakter içermeyen ikinci komut kabuğunuz tarafından dokunulmaz ve düzgün çalışır.

$ 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 teşekkürler, fikriniz doğruydu, izni 755 olarak değiştirdim ve şimdi iyi çalışıyor.
Faysal

3
@Faisal: Tanının doğru olduğunu ortaya koymasına rağmen izinleri değiştirmenin uygun bir çözüm olmadığını düşünürüm. Uygun çözüm, sudo komutunu hazırlarken globbing yapmak gibi görünmüyor, daha ziyade burada (yol argümanını alıntılayarak) bastırmak, argümanı olduğu gibi iletmek ls(kimlik değişikliği sugerçekleştiğinde) etkisi) globbing yapmak.
Marc van Leeuwen

2
@MarcvanLeeuwen lshiç zorlamıyor .
muru

3
sh -cKomut satırına ekleyerek sudo ortamında globbing gerçekleştirebilirsiniz .
Stig Hemmer

@Faisal bu soruya cevap veriyorsa, kabul etmeyi düşünün ...
clem steredenn

7

Globbing devre dışı bırakılmış olabilir.

Böyle bir şey için bak set -fya set -o noglobkomut bu satırların önce veya etkileşimli kabuk vadede ise echo $-; fçıktıda bir varsa , globbing devre dışı bırakılır:

$ echo $-
fhimBH

Bunu gidermek için kaldırmak set -fveya set -o noglobkomut dosyasından veya eğer etkileşimli kabuk vadede set +fveya 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

Evet, bireysel kullanıcı olarak bu yola erişimim yok. Senaryoda ben (ssh aracılığıyla) benim kullanıcı olarak gidiyorum ve üretim kullanıcı üzerinden bu komutu çalıştırıyorum. Bunun için bir çözüm var mı? (Bir noktaya dikkat çekmek için kullanıcı değiştirmek için şifre vermek zorunda değilim)
Faisal

@Faisal Komut dosyasını hedef kullanıcı ( sudo -u abc /path/to/script) olarak çalıştırmaya ne dersiniz ? Bu durumda globbing başarısız olmamalıdır. Her durumda muru cevabında yol sorununu önerdi, ben değil. Cevabını kabul etmeyi düşünmelisin ( askubuntu.com/help/accepted-answer ).
kos

Aslında ben -i gerekli olacağını bu yüzden komut dosyası ile uzak makinede çalıştırıyorum. Cevap verdiğiniz için teşekkürler.
Faisal
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.