una versione per kylix e fp che fa quello che chiedi e utilizza la potente libreria libc

Codice PHP:
procedure TTBase.TrasferisciPagina ;
const
  
LF = ^J;
  
READ_IOMode 'r';
var

  
nome_file string;
  
locale_adrremote_adr string;
  
transf_dati string;
  
strhostuserpsw string;

  
CmdArr : array[0..512of char;
  
StrArr : array[0..512of char;
  
PIOFILE;
  
pPipeStr Pointer;
  
string;
  
pidpid_child integer;
  
dir_base string;

begin


   
// lo preleva dalle impostazioni
   
locale_adr      := SetLocaleAdrMacro(IniFile.ReadString('Indirizzi Fisici''Root''/var/www/html'));

   
with DominiTbl do
   
begin

        remote_adr    
:= FieldByName('adr_root');
        
remote_adr    := SetRemoteAdrMacro(fDominioremote_adr);

        
transf_dati  := FieldByName('transf_dati');

        
host  := FieldByName('ftp_host');
        
user  := FieldByName('ftp_user');
        
psw   := FieldByName('ftp_password');

   
end;

   
nome_file := GetFileName;

     
// crea uno script per il trasferimento dei dati
   
dir_base := ExtractFileDir(Application.ExeName);
       
// crea la directory bin se non esiste
   
CreateDir(dir_base '/bin');

//   if not FileExists(dir_base + '/bin/trasf_pagina') then
   
begin
     with TStringList
.Create do
     
begin

       Add
('#!/bin/bash');
       
Add('#creato da ' automaticamente' + ' il ' + DateToStr(Now));

// trasferisce via ssh o via rtp
       if transf_dati = '
ssh' then
       begin
         Add('
scp $1/$' + user + '@' +host + ':$2');
       end
       else
       begin
         Add('
ftp ' + host + ' << EOF');
         Add('  
lcd $1');
         Add('  
cd $2');
         Add('  
put $3');
         Add('
EOF');
       end;

       SaveToFile(dir_base + '
/bin/trasf_pagina');

       Free;

     end;

     // dài permessi di esecuzione al nuovo file
     str := dir_base + '
/bin/trasf_pagina' + #0;
     chmod(@str[1], S_IRUSR Or S_IWUSR Or S_IXUSR);

   end;

   str := dir_base + '
/bin/trasf_pagina ' + locale_adr + ' ' + remote_adr + ' ' + nome_file + #0;

   pid := fork;
   case pid of

       0 :  begin

                 pid_child := GetPid;
                 StrCopy(cmdArr, @str[1]);

                 F := popen(CmdArr, READ_IOMode);
                 if assigned(F) then
                 begin
                      repeat
                        pPipeStr := fgets(StrArr, 1024, F);
                        if Assigned(pPipeStr) then
                        begin
                          LogFile.Write(StrPas(pPipeStr));
                        end;
                      until not Assigned(pPipeStr);
                      pClose(F);
                 end;

                 kill(pid_child, SIGTERM);

            end;

   end;

end; 
ciao
sergio