[php] newlines wegschrijven; raar resultaat in bash

Pagina: 1
Acties:

Onderwerpen


Verwijderd

Topicstarter
Hi

Wij zijn bezig met een hotspot-login-systeem. Hiervoor wordt het ip-adres opgeslagen in een bestand (/etc/squid/ip.list) wat dmv bashscripting uitgelezen wordt door de proxy (squid). Het wegschrijven naar dit bestand lukt; maar er doet zich een anomalie voor.

Stel, ip 172.16.20.80 wordt weggeschreven door php. Bash herkent schijnbaar niet dat ip, want er blijft geredirect worden naar de loginpagina. Als we echter het bestand bewerken adhv nano en zelf de "80" hertypen, met een nieuwe witregel, werkt alles naar believen. Iemand enig idee hoe dat komt?

De rechten worden niet aangepast, idem user/usergroup owners. Er is ook geen visueel verschil in nano. Met php wegschrijven gebeurt door onderstaande functies:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?
function allowIp($ip, $file) {
    $ips = file($file, FILE_IGNORE_NEW_LINES);
    if($ips == null)
        $ips = array();
    if(count($ips) == 0 || array_search($ip, $ips) === false) {
        $ips[] = $ip;
        $ips = implode(PHP_EOL, $ips);
        file_put_contents($file, $ips);
    }
}
    
function trimIp($ip, $file) {
    try {
        $ips = file($file);
    } catch(Exception $e){
        echo $e;
        return;
    }
    if(array_search($ip, $ips) !== false) {
        unset($ips[array_search($ip,$ips)]);
        $ips = implode(PHP_EOL, $ips);
        SpoonFile::setContent($file,$ips);
        //file_put_contents($file, $ips);
    }
}


Nota: PHP_EOL is uiteraard ook geprobeerd à la "\n" en "\r\n". Heeft iemand van jullie een idee? :/

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 11-09 13:55
Open dat bestand eens met een hex-editor, en bekijk het type line-ending.
Fix hem dan met nano, en bekijk hem nog een keer. Wat is het verschil?

ASCI 10 (\n) zou de juiste moeten zijn, wat ook in PHP_EOL zit.
Tenzij je op een Mac-server draait, dan kon het wel eens "'\r" zijn.

[ Voor 3% gewijzigd door frickY op 23-12-2010 19:17 ]


Verwijderd

Topicstarter
Ik was er zelf ook net op gekomen. FYI: het is een ubuntu linux.

De oplossing bestond erin
PHP:
1
$ips = implode(PHP_EOL, $ips);


om te zetten naar dit:

PHP:
1
$ips = implode("\n", $ips)."\n";


An sich vind ik het zowel logisch als vreemd. Logisch omdat het bash script telkens een nieuwe regel neemt, vreemd omdat enkel die laatste \n "ontbeekt". Enfin, het is opgelost. Bedankt!

(mag een slotje op wat mij betreft)

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Implode plakt strings aan elkaar. implode(',', array('foo', 'bar', 'baz')) geeft 'foo,bar,baz'. Dat is gewoon logisch en in zijn geheel niet vreemd. Wat wel onhandig is (maar nog steeds niet vreemd) is dat je bash-script vervolgens niet overweg kan met een regel zonder newline aan het einde.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • MueR
  • Registratie: Januari 2004
  • Laatst online: 12:45

MueR

Admin Tweakers Discord

is niet lief

Slotjes doen we alleen als het topic niet aan de regels voldoet (zie Het algemeen beleid #topiceinde).

Dit had je overigens best even in de manual op kunnen zoeken. Implode voegt niet na elke entry de separator toe, alleen tussen entries.

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • ReenL
  • Registratie: Augustus 2010
  • Laatst online: 14-09-2022
Je gaat hier problemen mee krijgen:
* File wordt te groot en past niet in memory;
* allowIp is niet race-condition save, ofwel je voegt 2 ip's rond dezelfde tijd toe en alleen de laatste wordt toegevoegd.

Hoe wel?
* Lock op de file zetten (nog steeds het memory probleem);
* In een database wegschrijven en een php script maken die het uitleest in je bash script:
IPLIST=`php ip-export.php`

Let ook op dat de laadtijd steeds ietsje hoger wordt, naarmate er mer ip's in het bestand staan.
Pagina: 1