domingo, 23 de diciembre de 2012

Runnig rsync over ssh tunnel

I spend one whole day trying to run rsync client over ssh tunneling in one command. At this time I do it. The problem was a & symbol in LocalCommand option of ssh. There is the step for do it.

  1. Create key-pair certificate for non-interactive connection to server
  2. Configure and test client side for no-interactive ssh connection to server
  3. Load nobody user public certificate to server
  4. Configure ssh daemon in server for allow key-pair authentication for user nobody
  5. Test nobody connection to server
  6. Configure rsync server for accept only local connection
  7. Test rsync connection over ssh
# create certificate without password on client side
ssh-keygen -b 2048 -t rsa -f nobody.cert
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in nobody.cert.
Your public key has been saved in nobody.cert.pub.
The key fingerprint is:
28:50:07:52:56:63:35:44:10:57:53:79:bf:53:87:5b main@311c
The key's randomart image is:
+--[ RSA 2048]----+
|  ..=oB**.o...   |
|   + o o . .. .  |
|  .          . o |
|   .   .      . E|
|    . . S      o+|
|     .        .o |
|                .|
|                 |
|                 |
+-----------------+
# private key file nobody.cert and public key file nobody.cert.pub has been create

# create a ssh configuration file
vi $HOME\.ssh\config

# Fill with this
Host <server-ip>
user nobody
Hostname <server-ip>
IdentityFile /home/<user-name>/.ssh/nobody.cert
AddressFamily inet
#BatchMode yes
IdentitiesOnly yes
LocalForward 1873 127.0.0.1:873
ExitOnForwardFailure yes
SendEnv yes
PermitLocalCommand yes

# send public key to server using root or another account
scp nobody.cert.pub root@<server-ip>:/home/nobody/.ssh

# login to server and check nobody user configuration
grep nobody /etc/passwd       
nobody:x:501:501:Linux User,,,:/ffp/home/nobody:/ffp/bin/sh

#go to nobody home folder to add pub key into allowed keys
cd /ffp/home/nobody/.ssh
cat nobody.cert.pub >> authorized_keys

#configure ssh server daemon to allow key-pair authentication
vi /etc/ssh/sshd_config

# verify this lines
Protocol 2
RSAAuthentication yes
PubkeyAuthentication yes    
AuthorizedKeysFile        .ssh/authorized_keys
AllowTcpForwarding yes

# restart ssh server
/etc/init.d/ssh restart

# test connection to server
ssh <server-ip>
# If everything is ok password will not prompted and
# nobody user will be logged, else 
# try setting BatchMode to yes in config file to allows password prompt
# try setting IdentitiesOnly to false
# Check access to folder .ssh for nobody user

#change rsync server configuration file
vi /etc/rsyncd.conf

#put this line at beginning
address = 127.0.0.1

#restart rsync server
/etc/init.d/rsync restart

# try to connect to rsync over ssh with this command
export RSYNC_CMD='rsync -aqrut --port=1873 %d/working/ rsync://localhost/%u/ &'
ssh -o "LocalCommand=$RSYNC_CMD" <server-ip> sleep 2
# The directory $HOME/working will send to rsync 
# symbol & at end is very important, otherwise rsync client will be blocked for an unexplainable reason

# Good Luck

lunes, 5 de noviembre de 2012

Dlink DNS313 installing App

I will try to upgrade mi dlink dns313, because the torrent client that come with it do not support magic link for torrent files, in another hand y want to use a commun interfaz to communicate with torrent client.
Connect to dns313 data partition
to linux pc by usb cable.
mount the partitions in /mnt/p1...4

mount -t ext3 /dev/sdb3 /mnt/p3
mount -t ext2 /dev/sdb4 /mnt/p4
mount -t ntfs /dev/sdb2 /mnt/p2

cd /mnt/p2
wget http://www.inreto.de/dns323/fun-plug/0.5/fun_plug
wget http://www.inreto.de/dns323/fun-plug/0.5/fun_plug.tgz

vi fun_plug
# change FFP_PATH=/mnt/HD_a2/ffp
# by
# FFP_PATH=/mnt/HD_a4/ffp

umount /mnt/p*
restart dns313.

telnet

the first step is to change root password to avoid unautorizate access.
mkdir -p /ffp/home/root

#change shell and home folder of root
usermod -s /ffp/bin/sh root
usermod -d /ffp/home/root root
#The pwconv command creates shadow from passwd and an optionally existing shadow.
pwconv
passwd

The new password most be store in the nas, otherwise it will erase on next reboot.

cd /ffp/sbin
wget http://wolf-u.li/u/172/ -O store-password.sh

store-passwd.sh

#next step enable ssh and disable telnet.

cd /ffp/start
chmod a+x sshd.sh

./sshd.sh start
Generating public/private rsa1 key pair.
Your identification has been saved in /ffp/etc/ssh/ssh_host_key.
Your public key has been saved in /ffp/etc/ssh/ssh_host_key.pub.
The key fingerprint is:
.
.
.
Generating public/private rsa key pair.
Your identification has been saved in /ffp/etc/ssh/ssh_host_rsa_key.
Your public key has been saved in /ffp/etc/ssh/ssh_host_rsa_key.pub.
The key fingerprint is:

#try lo login using ssh
ssh -l root

cd /ffp/start

chmod a-x telnetd.sh

#restart device.
#Next: Install torrent client

#Step for install transmission torrent client
#login to device with ssh

#for fun-plug v0.5 do it
cd
wget http://kylek.is-a-geek.org:31337/files/ffp/0.5/curl-7.18.1.tgz
wget http://inreto.de/ffp/0.7/arm/packages/curl-7.21.4-arm-1.txz
funpkg -i curl-7.18.1.tgz
wget http://kylek.is-a-geek.org:31337/files/ffp/0.5/Transmission-2.71-1.tgz
funpkg -i Transmission-2.71-1.tgz

Run transmission for first time
-w download files to
-a allow connect from
-g config file
-p port for web or RPC  interface
-t autentication for web is required


 su nobody -c "transmission-daemon -f -g /mnt/HD_a2/.transmission-daemon -w /mnt/HD_a2/Downloads -t -u  -v  -a 127.0.0.1,192.168.1.*"

Use WebBrowser and navigate to
:9091

stop transmission client with CTRL-C and restart with

/ffp/start/transmission.sh start

******* unused ***********
user:root
password:11111

miércoles, 31 de octubre de 2012

NVIDIA ION in Linux at 311c

I try to install nvidia ion dirver in 311c Compaq Mini Atom pc. I downloaded file NVIDIA-Linux-x86-304.60.run.

chmod +x  NVIDIA-Linux-x86-304.60.run
./NVIDIA-Linux-x86-304.60

All are problems with this file. At end the folder /var/lib/dkms/nvidia/304.60 has been created. Problems with gcc version most be resolved with CC param.


cd /var/lib/dkms/nvidia/304.60/build
make CC=gcc-4.3
make CC=gcc-4.3 install


viernes, 26 de octubre de 2012

Linux installations in opt

For KDE Web Dev correct compilation use:


apt-get install kdelibs4c2a xorg-dev libqt3-headers kdelibs5-dev kdelibs4-dev
./configure --prefix=/opt/kdewebdev

Warning: you chose to install this package in /opt/kdewebdev,
but KDE was found in /usr.
For this to work, you will need to tell KDE about the new prefix, by ensuring that KDEDIRS contains it, e.g. export KDEDIRS=/opt/kdewebdev:/usr
Then restart KDE.

BlueFish:
apt-get install intltool
./configure --prefix=/opt/bluefish

Pinta:
apt-get install mono-xbuild

Linux local deb package directory

To build file Package.gz inside deb directory use:

cd to parent directory
build 

dpkg-scanpackages $directory-name /dev/null | gzip -9c > $directory-name/Packages.gz
 
Update /etc/apt/sources.list

deb file:$parent-directory/ $directory-name/

execute
apt-get update
 
Look for package from file
apt-get install apt-file
apt-file update

 
apt-file search $file-name 
 

jueves, 25 de octubre de 2012

Firefox - linux tips

Mi ordenador ATOM 1.6 con Debian/linux se vuelve un poco lento a veces. Cuando utilizas firefox hay instalado un plugin para flash de desarrollo libre que suele consumir mucho porcesador. su nonmbre gtk-snash. la solución pasa por eliminarlo de la forma.

apt-get remove --purge gnash gnash-common mozilla-plugin-gnash

domingo, 14 de octubre de 2012

Linux boot

Tengo la siguiente idea, instalar linux sobre un disco de sol lectura como puede ser una tarjeta SD, y dejar el disco solo para los operaciones de escritura, para ver si puedo reducir el consumo del ordenador y acelerar el acceso a ficheros.
Hay un sistema de archivo que permite hacer un espejo de una carpeta donde se realizan modificaciones pero solo se realiza en ram y al apagar el ordenador se regresa al estado anterior, esto puede ser util para que las aplicaciones que no cumplen con los estandares sobre estrutura en disco puedan operar con tranquilidad, tal es el caso de accesos de escritura sobre etc y otras carpetas del sistema que deberian poder ser utilizadas como read-only pero en la práctica esto no funciona de manera correcta.
Tambien esta la posibilidad, y esta idea es tomada de Android, de poder crear un estrutura de carpetas incial en el root fs, utilizando un punto de montaje cobre ram, para ello hay que estudiar bien el proceso de boot de linux, voy a resumir todo lo que aparece en internet sobre ello.
Hay tres etapas.
BIOS
MBR Master Boot Record
Kernel
Init.
Mi interes recide en las dos últimas. El kernel inicializa los dispositivos, monta el sistema de archivos raiz como solo lectura, se carga en memoria el sistema de archivos initrd, se ejecuta /linuxrc el cual carga los modulos, inicializa los dispositivos, y finaliza, luego es cargado el rootfs especificado por linea de comando y se ejecuta el /sbin/init, el cual utiliza el /etc/inittab.
Es necesario poder montar un sistema de achivos raiz y permitir ralizar modificaciones sobre el sin escribir realmente en disco. Tambien se pueden montar el rootfs en ram y luego montar el un sistema ro y realizar los links necesarios para el correcto funcionamiento del s.o.
continuara ...

viernes, 12 de octubre de 2012

Optimizando gnome

Cuando inicimio mi pequeño ordenador con procesador ATOM 1.7GHz, a pesar de terner instalado debian, el rendimiento no es el esperado por mi, además de estar el CPU casi siempre con alto uso, por ello el ventilador que lo refresca no para de girar.
Hoy e ejecutado top y he notado como un proceso llamado evince-tumbnails se comía toda la cpu, segun parece esto pertenece al gnome y se utiliza para generar algun que otro tipo de icono cuando navegamos por los directorios con un browser.
Hay una configuración de gnome que permite desabilitar este comportamiento, utilizando la aplicacion  gconf-editor se puede acceder a todos los parametros de gnome y el que me interesaba modificar es desktop/gnome/thumbnailers/disable_all , espero que le proxima vez al reiniciar el ordenador lo note un poco mas rápido.

miércoles, 12 de septiembre de 2012

Firefox & Citrix

Voy a comenzar un nuevo bloque de entradas sencillas y cortas que serán utilizadas para exponer mis problemas y soluciones del día a día. Y todo sera como un lugar donde buscar siempre las soluciones.
El primer problema al que me he enfrentado estos días y del cual no he logrado una solución definitiva, pero algo he podido resolver.
Me he conectado a un entorno remoto mediante Citrix y Firefox, pero al intentar ejecutar las aplicaciones publicadas, me dice que en el navegador que no estan habilitados los accesos directos. Hay que modificar la configuración de firefox utilizando la pagina about:config y buscar la keyword signed.applets.codebase_principal_support, y definir como valor true.
Esta configuración posibilita que se puedan ejecutar aplicaciones del sistema operativo desde applets en  firefox.

viernes, 17 de febrero de 2012

for vs while

Hoy quiero mostrar una pequeña diferencia entre el for y el while. Para ello vamos a empezar con el siguiente fragmento de código.

char	*cptr;
char	*texto = "abcdefghijklmnopq";
for (cptr=texto;*cptr;cptr++)
{
    printf("%c",*cptr);
}
cptr = texto;
while (*cptr)
{
   printf("%c",*cptr);
   cptr++;
}

Utilizando el compilador de Microsoft sin optimizaciones obtenemos.

for (cptr=texto;*cptr;cptr++)

  mov eax,dword ptr [ebp-14h]
  mov dword ptr [ebp-10h],eax
  jmp 1
2:mov ecx,dword ptr [ebp-10h]
  add ecx,1
  mov dword ptr [ebp-10h],ecx
1:mov edx,dword ptr [ebp-10h]
  movsx eax,byte ptr [edx]
  test eax,eax
  je 3
cptr = texto;
while (*cptr)
3:mov eax,dword ptr [ebp-14h]
  mov dword ptr [ebp-10h],eax
  
  
  
  
  mov ecx,dword ptr [ebp-10h]
  movsx edx,byte ptr [ecx]
  test edx,edx
  je 4
printf("%c",*cptr);
  mov ecx,dword ptr [ebp-10h]
  movsx edx,byte ptr [ecx]
  push edx
  push offset string "%c"
  call printf
  add esp,8
  jmp 2
printf("%c",*cptr);
  mov eax,dword ptr [ebp-10h]
  movsx ecx,byte ptr [eax]
  push ecx
  push offset string "%c"
  call printf
  add  esp,8
cptr++;
  mov edx,dword ptr [ebp-10h]
  add edx,1
  mov dword ptr [ebp-10h],edx
  jmp 3
4:

Como se aprecia utilizando el while hemos eliminado la instruccion jmp 1 el resto del código se mantiene inalterado. Este comportamiento que acabamos de observar se debe a que el ciclo for genera las instrucciones de lazo al comienzo.

Veamos que ocurre si necesitamos ignorar el tratamiento del caracter b, es decir este no sera mostrado por pantalla.

for (cptr=texto;*cptr;cptr++)
{
    if (*cptr =='b') continue;
    printf("%c",*cptr);
}
cptr = texto;
while (*cptr)
{
   if (*cptr != 'b')
   {
      printf("%c",*cptr);
   }
   cptr++;
}

Como podemos apreciar el uso del for genera un código mas limpio, ya que utilizando la sentencia continue se puede ir a la proxima iteración, mientras que en un while hay que invertir la condicion para poder ejecutar la instruccion de iteracion como si de un else se tratara.

for (cptr=texto;*cptr;cptr++)
 ... 
if (*cptr =='b') continue;
  mov ecx,dword ptr [ebp-10h]
  movsx edx,byte ptr [ecx]
  cmp   edx,62h
  jne   5
  jmp   2
printf("%c",*cptr);
5: ..
while (*cptr)
 ... 
if (*cptr != 'b')
  mov edx,dword ptr [ebp-10h]
  movsx eax,byte ptr [edx]
  cmp eax,62h
  je  6

cptr++;
6: ...

No me explico porque el compilador utilizo dos instrucciones de salto en el caso del for, de no haber sido asi los dos ejemplos serían idénticos. A modo de resumen utilizando el while hemos conseguido reducir una instruccion, si utilizamos la sentencia continue se genera la misma cantidad de instrucciones en los dos casos (o debería), eso si el codigo con while se vuelve mas extenso visualmente

En estos ejemplos sencillos donde se esta iterando una cadena de caracteres se pueden eliminar un par de instrucciones más si almacenamos el valor del caracter en una variable temporal.

char	c;
cptr = texto;
while (*cptr)
{
   c = *cptr;
   if (c != 'b')
   {
      printf("%c",c);
   }
   cptr++
}




if (*cptr !='b')
  mov edx,dword ptr [ebp-10h]
  movsx eax,byte ptr [edx]
  cmp eax,62h
  je  6
printf("%c",*cptr);
  mov ecx,dword ptr [ebp-10h]
  movsx edx,byte ptr [ecx]
  push edx
  push offset string "%c"
  call printf
  add esp,8
  jmp 2
c = *cptr;
  mov ecx,dword ptr [ebp-10h]
  mov dl,byte ptr [ecx]
  mov byte ptr [ebp-14h],dl
if (c != 'b')
  movsx edx,byte ptr [ebp-14h]
  cmp edx,62h
  je 6

printf("%c",c);
  movsx ecx,byte ptr [ebp-14h]
  push ecx
  push offset string "%c"
  call printf 
  add esp,8
  jmp 2

A pesar de utilizar 3 instrucciones para inicializar la variable c , cada vez que accedemos a *cptr nos ahorramos una instrucción, en tres accesos amortizamos el coste. Quiero aclarar que esto no es aplicable cuando iteramos entre estructuras. Se debe utilizar cuando accedemos continuamente a un mismo valor a traves de un puntero.

Vamos a realizar las ultimas modificaciones sobre el ciclo par intentar optimizarlo un poco mas, si el compilador nos ayuda claro esta.

while (c=*(cptr++))
{
   if (*cptr != 'b')
   { 
      printf("%c",*cptr);
   }
}

while (*cptr) {
c=*cptr;
cptr++;
  mov ecx,dword ptr [ebp-10h] 
  movsx edx,byte ptr [ecx]
  test edx,edx
  je 4 
  mov eax,dword ptr [ebp-10h] 
  mov cl,byte ptr [eax]
  mov byte ptr [ebp-14h],cl
  mov edx,dword ptr [ebp-10h] 
  add edx,1
  mov dword ptr [ebp-10h],edx 
while (c=*(cptr++)) {


  mov edx,dword ptr [ebp-10h] ecx = cptr 
  mov al,byte ptr [edx]
  mov byte ptr [ebp-14h],al   c = *cptr 
  movsx ecx,byte ptr [ebp-14h]
  mov edx,dword ptr [ebp-10h] cptr++ 
  add edx,1
  mov dword ptr [ebp-10h],edx
  test ecx,ecx                c == 0 
  je  4

Como imaginaba, el compilador no ha sido de gran ayuda, ya que ha cargado el valor de cptr en edx por segunda vez sin necesidad; además en vez de utilizar un test al,al que ya contiene el valor de c, ha utilizado ecx resultando en una instruccion más. A pesar de todo el código es una instruccion menor. Eso si aqui se ha hecho una comparación desigual, pero no va mejorar mucho si utilizamos c = *(cptr++);en el código de la izquierda.

No me cabe duda el compilador no optimiza lo mas obvio, es cierto que he compilado sin optimizaciones. De todas formas voy a realizar pruebas utilizando gcc o g++ y expondre mis resultados