Miksi ./filename
käytetään tiedoston suorittamiseen linuxissa?
Miksi ei kirjoita se vain kuten muut komennot gcc
, ls
jne …
Kommentit
- Eikö ’ t kirjoittaisi ensimmäinen rivi paremmin nimellä ” Miksi käytämme
./command_name
suorittaa komento linuxissa? ” - user15760, Ei, koska haluamme kysymysten olevan löydettävissä hakukoneista, eivätkä kaikki, joilla on tämä kysymys, ovat luonnollisia syntyneitä ’ nixstereitä (:
Vastaa
Linux-, UNIX- ja siihen liittyvissä käyttöjärjestelmissä .
tarkoittaa nykyistä hakemistoa. Koska haluat suorittaa tiedoston nykyisessä hakemistossa ja kyseisessä hakemistossa ei ole $PATH
-tietokoneessasi, tarvitset ./
-bitin kertoaksesi kuorelle missä suoritettava tiedosto on. Joten ./foo
tarkoittaa ajaa tässä hakemistossa olevaa suoritettavaa tiedostoa nimeltä foo
.
Voit käyttää type
tai which
saadaksesi $PATH
-komennostasi löydettyjen komentojen täydellisen polun.
Kommentit
Vastaa
Kirjaimellinen vastaus on sama kuin muut ovat antaneet: koska nykyinen hakemisto ei ole ”$PATH
.
Mutta miksi? Lyhyesti sanottuna se on turvallisuuden kannalta. Jos etsit jonkun toisen kotihakemistoa (tai / tmp) ja kirjoitat vain gcc
tai ls
, haluat tiedät, että käytät todellista versiota, ei haittaohjelmaa, jonka kaverisi ystäväsi on kirjoittanut ja joka poistaa kaikki tiedostosi. Toinen esimerkki olisi test
tai [
, joka saattaa ohittaa komentot komentosarjan komentosarjoissa, jos komentotiedostossasi ei ole niitä sisäänrakennettuina.
Jos .
on viimeinen merkintä polullasi on vähän turvallisempi, mutta on myös muita hyökkäyksiä, jotka hyödyntävät sitä. Helppo on hyödyntää yleisiä kirjoitusvirheitä, kuten sl
tai ls-l
. Tai etsi yhteinen komento, jota ei ole asennettu tähän järjestelmään – esimerkiksi vim
, koska sysadminit ovat todennäköisesti keskimääräistä todennäköisempiä kirjoittamaan sen.
Kuulostaako tämä liian teoreettiselta? Se suurimmaksi osaksi on, mutta se voi varmasti tapahtua todellisuudessa, etenkin monen käyttäjän järjestelmissä. Itse asiassa tässä on esimerkki tältä sivustolta , jossa järjestelmänvalvoja vaihtoi käyttäjien kotihakemistoon ja löysi ps
että tämän nimen suoritettava tiedosto peittää.
Kommentit
- Sinulla on oltava vain absoluuttiset polut kohdassa
PATH
ympäristömuuttuja.
Vastaa
Jos tarkoitat, miksi tarvitset./ alussa – se johtuu (toisin kuin Windowsissa), nykyinen hakemisto ei ole oletusarvoisesti polkusi. Jos suoritat:
$ ls
komentotulkki etsii ls
PATH-ympäristömuuttujan hakemistoista (echo $PATH
nähdäksesi sen), ja suorittaa ensimmäisen löytämänsä suoritettavan tiedoston nimeltä ls
. Jos kirjoitat:
$ a.out
kuori toimii samoin – mutta se todennäköisesti ei löydä a.out-nimistä suoritettavaa tiedostoa. Sinun on kerrottava kuorelle, missä a.out on – se on nykyisessä hakemistossa (.), polku on ./a.out
.
Jos kysyt, miksi sitä kutsutaan ”a.out”, se on vain gcc: n oletustulostustiedoston nimi. Voit vaihtaa sen -o-komentorivillä arg. Esimerkiksi:
$ gcc test.c -o test $ ./test
Kommentit
- Kiitos. Epäilen, miksi tarvitset ./ alussa …. Sain käyttää ”.” (nykyisen hakemiston käyttämiseksi), mutta miksi ” / ” sen jälkeen?
- / on polun erotin Linuxissa, joten sen avulla erotat hakemiston (.) tiedostonimestä (a.out). Ilman sitä sinulla on .a.out, joka on kelvollinen tiedostonimi itsessään. (Kokeile
touch .a.out; ls -lA
nähdäksesi tämän.) - näin määrität polku Unixissa,
<dir>/<file>
, joten sanot periaatteessa suorittavan tiedoston nykyisessä hakemistossa, joka on merkitty./test
- Red Hat Linux 9? Aika päivittää!
- Windows 10: ssä PowerShell on nyt oletuskuori, ja se vaatii myös
./
suorittamaan suoritettavan tiedoston nykyisellä polulla
Vastaus
Voit yrittää lisätä :.
muuttujaasi $ PATH.
Kokeile ALT + F2 ja kirjoita: gksudo gedit /etc/environment
, jos käytät Linux / GTK: ta (tämä on mitä sinulla on, jos käytät Ubuntua).
MITEN, Kehotan lämpimästi, ettet tee sitä. Se on huono, huono ja huono.
Tiedät, että tällaiset asiat toimivat näin vuodesta 1970 lähtien. On olemassa syy, miksi nykyistä hakemistoa ei sisälly $ PATH: iin.
.
on nykyinen hakemisto.
.something
olisi piilotettu tiedosto (kirjoita ”ALT +” tehdäksesi ne näkyvät Nautilus-ohjelmassa tai kokeile ”ls -la
”.
./someProgram.sh
kirjoitat suorittamaan suoritettavan someProgram .sh nykyisessä hakemistossa.
.somethingElse
tarkoittaisi, että sinulla on piilotettu suoritettava tiedosto nykyisessä hakemistossa, mikä on huono idea.
vastaus
Täydellisempi sääntö on itse asiassa: jos jokin kauttaviiva /
on polulla, älä etsi PATH
Ennen kuin menemme perustelut, sinun on ensin tiedettävä tästä tosiasiasta: jompikumpi seuraavista:
bin/someprog
tai:
tai:
cd bin ./myexec
suorita bin/someprog
etsimättä PATH
muuttuja täsmälleen samasta syystä: kaikki bin/someprog
, /bin/someprog
ja ./someprog
on vinoviiva /
.
someprog
yksinään ei ole vinoviivaa /
ja etsii siksi vain hakemistosta PATH
.
POSIX 7 määrittelee tämän säännön: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_01_01
PATH
[…] Jos etsittävä polun nimi sisältää
<slash>
, etsintää polun etuliitteiden kautta ei suoriteta .
/
POSIX-PATH-säännön perustelut
Oletetaan, että käynnissä:
someprog
hakisi:
- suhteessa CWD: hen ensin
- suhteessa PATH: iin
Jos sitten haluat juosta /bin/someprog
jakelustasi ja teit:
someprog
se joskus toimisi, mutta toiset epäonnistuisivat, koska saatat olla hakemistossa, joka sisältää toisen etuyhteydettömän someprog
-ohjelman.
Siksi opit pian, että tämä ei ole luotettavaa, ja päädyit aina käyttämään absoluuttiset polut, kun haluat käyttää PATH-ohjelmaa, mikä päihittää PATH: n tarkoituksen.
Siksi suhteellisten polkujen käyttäminen PATH: ssa on todella huono idea. ”M katson sinua, node_modules/bin
.
Oletetaan päinvastoin, että käynnissä:
./someprog
Etsisi:
- suhteessa PATH ensin
- suhteessa CWD: hen sen jälkeen, kun
Jos latait sitten komentosarjan someprog
git-arkistosta ja haluat suorittaa sen CWD: stä, et olisi koskaan varma, että tämä on varsinainen ohjelma, joka suoritettaisiin, koska ehkä distroosi on:
/bin/someprog
joka on sinussa PATH from jokin paketti, jonka asennit juomasi liikaa viime vuoden joulun jälkeen.
Siksi sinun on jälleen kerran pakko suorittaa aina paikalliset komentosarjat suhteessa CWD: hen täydellä polulla, jotta tiedät mitä käytät:
"$(pwd)/someprog"
mikä olisi myös erittäin ärsyttävää.
Toinen sääntö, jonka kanssa saatat olla kiusaus, olisi:
suhteelliset polut käyttävät vain polkua, absoluuttiset polut vain CWD
mutta jälleen kerran tämä pakottaa käyttäjät käytä aina absoa lute-polut muille kuin PATH-skripteille, joissa on "$(pwd)/someprog"
.
/
-polun hakusääntö tarjoaa yksinkertaisen muistettavan ratkaisun noin-ongelmaan:
- kauttaviiva: älä käytä
PATH
- ei kauttaviivaa: käytä vain
PATH
mikä tekee ajamisesta aina erittäin helpon, luottaen siihen, että nykyisen hakemiston tiedostot voidaan ilmaista joko ./somefile
tai somefile
, ja siten se antaa erityisen merkityksen yhdelle niistä.
Joskus on hieman ärsyttävää, että et voi etsiä haulle some/prog
suhteessa PATH
, mutta en näe selvempää ratkaisua tähän.
alias
ejä, jotka voivat päästä tielle, ei vain$PATH
..
, se olisi tietoturvaongelma, sinä tai joku muu voisi korvata Esimerkiksils
(yksinkertainen virus / trojen: tee zip-tiedosto, jossa on suoritettava tiedosto nimeltäls
, kun joku etsii, he suorittavat tämän suoritettavan tiedoston, se…). Jos se haki hakemistoa.
viimeisenä, voit viettää pitkän ajan hulluksi tietämättä miksi ohjelmasi ei toimi (esim. Teet ohjelman nimeltä testi sen sijaan, että suoritat sen suorittaman ohjelman joka ei tuota lähtöä.