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

  • On hyvin yleistä suorittaa ohjelmia nykyisessä hakemistossa. Miksi ’ t ei kuori etsi myös siellä? Se hakee ensin sisään, sitten $ PATH: sta.
  • On myös alias ejä, jotka voivat päästä tielle, ei vain $PATH.
  • @Michaelin turvallisuus ja järkevyys: Jos se etsisi ensin ., se olisi tietoturvaongelma, sinä tai joku muu voisi korvata Esimerkiksi ls (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öä.
  • @jcubic että ’ on huono idea. Katso yllä oleva kommentti. Aikaisemmin DOS-haut nykyisessä hakemistossa ja tämä käytös tapahtui Windows cmd: ssä, mikä tuo mukanaan paljon turvallisuusongelmia. MS on korjannut sen PowerShellissä, ja sinun on nyt käytettävä. \ -Ohjelmaa ohjelman suorittamiseksi nykyisessä hakemistossa
  • @ ctrl-alt-delor: Kun olin yliopistossa 80-luvun lopulla ’ s, tämä oli yleinen (kielletty) taktiikka. Kirjoitetaan ” ls ” -ohjelma ja jätetään se kotikansioon, jos joku muu tulee nuuskimaan. Ohjelmaa kutsuttiin nimellä ” get shell ” IIRC. Se yrittäisi saada komennon suorittavan käyttäjän tunnistetiedot – ja sitten tulostaa väärennetyn hakemistoluettelon, jättäen heidät tietämättä.

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.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *