Autor Zpráva
malej
Profil
Co dělám špatně?

<?php

if(! $connection = ssh2_connect("127.0.0.1", 22)) { die("Chyba spojeni!"); }
if (ssh2_auth_password($connection, "user", "pass")) {
  echo "Prihlaseni probehlo v poradku!\n";
} else {
  die("Prihlaseni nebylo uskutecneno v poradku!\n");
}

$sftp = ssh2_sftp($connection);

if (!is_dir("ssh2.sftp://$sftp/uploaded")) {
    mkdir("ssh2.sftp://$sftp/uploaded", 0775) or die("Nepodarilo se vytvorit");

} else {
    echo "\nAdresar existuje";
}
?>


Pokaždé vypíše "Nepodarilo se vytvorit". Jednak v prvním kroku nedetekuje jestli tam složka je nebo ne a také žádnou nevytvoří.
Radek Cvek
Profil
a toto by nešlo?
if (!file_exists("ssh2.sftp://$sftp/uploaded")) ...
Alphard
Profil
malej:
a také žádnou nevytvoří
Zkoušel jste přímo ssh2_sftp_mkdir()? Třeba to pomůže zjistit, kde hledat problém.
malej
Profil
Alphard:
přes tuhle to jde, ale ten if pořád nejde
malej
Profil
Radek Cvek:
Zkoušel jsem, nefunguje.
Problém bude pravděpodobně v té cestě, jenže takhle je popsána v manuálu.
Alphard
Profil
malej:
Problém bude pravděpodobně v té cestě
Vypadá to tak, ale nemohu najít žádnou chybu.
Máte povolený výpis chyb? Žádné jiné vodítko?

Zkusil jste vypsat návratovou hodnotu file_exists()? Vrací false, nebo něco jiného?

Funkci ssh2_sftp() byste mohl zkusit obejít pomocí Example #1 Opening a stream from an active connection, resp. přímo zadáním do adresy, dle Options na stejné stránce.

Na Can't get SFTP to work in PHP autor dotazu v editu píše, že mu problémový kód funguje při připojení na jiný server. Jestli máte možnost připojit se jinam, můžete to také zkusit.
malej
Profil
Alphard:
V logu apache nic a chyby by to mělo vypisovat normálně.
Po zadání
echo file_exists("ssh2.sftp://$sftp/uploaded/");
je výstup prázdný.
Přímé zadání adresy také nepomáha (Example #1 Opening a stream from an active connection:Options)
Jinak ssh2_sftp_mkdir fungovala takže spojení je ok.

Jediné co nejde je prefix ssh2.sftp://$sftp/ (resp. ssh2.sftp://user:pass@example.com:22/path/to/filename).

Tohle jsem našel v auth.log po vykonání skriptu.
Jan  5 23:35:44 malej-laptop sshd[6218]: Accepted password for sshtest from 127.0.0.1 port 40907 ssh2
Jan  5 23:35:44 malej-laptop sshd[6218]: pam_unix(sshd:session): session opened for user sshtest by (uid=0)
Jan  5 23:35:44 malej-laptop sshd[6332]: subsystem request for sftp
Jan  5 23:35:44 malej-laptop sshd[6332]: Received disconnect from 127.0.0.1: 11: PECL/ssh2 (http://pecl.php.net/packages/ssh2)
Jan  5 23:35:44 malej-laptop sshd[6218]: pam_unix(sshd:session): session closed for user sshtest

...Ale je to tak zřejmě správně (stejný log po zakomentování části s prefixem.)

Kdyby existovala funkce file_exists pro ssh2-php nemusel bych prefix použít.

Už začínám být zoufalý.
Davex
Profil
malej:
Po zadání echo file_exists("ssh2.sftp://$sftp/uploaded/"); je výstup prázdný.
Zkus přetypovat výstup funkce:
echo (int) file_exists("ssh2.sftp://$sftp/uploaded/");

Pokud nemáš posunutý kořen, tak možná uživatel user nemá právo vytvářet adresář /uploaded. Jaký adresář se vypíše s tímto kódem?
if ($dir = scandir("ssh2.sftp://$sftp/")) {
  echo implode("<br>\n", $dir);
}

Bez problémů vytvořím adresář takto:
mkdir("ssh2.sftp://$sftp/home/muj/web/uploaded", 0775);
malej
Profil
echo (int) file_exists("ssh2.sftp://$sftp/uploaded/");
- Píše FALSE (0) i když adresář vytvořím ručně.

if ($dir = scandir("ssh2.sftp://$sftp/")) {
  echo implode("<br>\n", $dir);
}

- Vypíše root hlavního disku, ale home adresář je nastavený do rootu projektu na kterém pracuji. V /etc/passwd je to nastaveno takto:
sshtest:x:1003:1003::/media/sda3/Projects/nabytekkolarik/:/bin/sh


Když se přihlašuji v konzoli tak mě to skutečně vypisuje home adresář který jsem nastavil v /etc/passwd. Proč to nefunguje v php stejně?
Davex
Profil
malej:
Proč to nefunguje v php stejně?
Ten phpéčkový klient to pravděpodobně neumí, protože je to zatím vývojová betaverze 0.11.2. Pošli autorům sponzorský dar a požádej je o doplnění podpory přechodu do domovského adresáře.
malej
Profil
Davex:
Vyřešeno pomocí ChrootDirectory v /etc/ssh/sshd_config.

Nejde o to že tam má přejít, ale o to že ignoruje nastavení výchozího adresáře.

Každopádně ještě jednou velký dík za nápad se scandir. :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0