SSH-Server auf deinem Android (CyanogenMod)

In dem „CyanogenMod“ (CM) ist bereits ein SSH-Server eingebaut (Dropbear), dieser ist jedoch standardmäßig abgeschaltet. Hier zeige ich kurz wie du diesen unter Linux / Windows nutzen kannst und dich somit ohne Kabel mit deinem Android (funktioniert nach meinen Tests, nur im lokalen W-Lan) verbinden kannst …  ;-)

 

1.) Android: Vorbereitungen

adb shell

(adb shell)

mkdir /data/dropbear
cd /data/dropbear
dropbearkey -t dss -f dropbear_dss_host_key
dropbearkey -t rsa -f dropbear_rsa_host_key

 

2.1) Linux: Vorbereitungen (Debian / Ubuntu)

2.1.1) Installiere den SSH-Client

sudo aptitude install ssh-client

2.1.2) SSH-Schlüssel generieren

ssh-keygen -t rsa

2.1.3) Übertrage den SSH-Schlüssel (öffentlich / public) zu Android

adb push ~/.ssh/id_rsa.pub /data/dropbear/.ssh/authorized_keys

 

2.2) Windows: Vorbereitungen
PuTTY Download Page

2.2.1) Download „PuTTYgen“

2.2.2) SSH-Schlüssel generieren

Klick auf „Generate“ und füge die Zeichenkette, welche du nun im Fenster von puttygen siehst (Beispiel: „ssh-rsa AAAAB3…hclQ==rsa-key-20100227“) in eine Text-Datei auf deinem Desktop ein -> „id_rsa.pub“ und speichere (beschütze) deinen „private key“!!!

2.2.3) Übertrage den SSH-Schlüssel (öffentlich / public) zu Android

adb push  C:\Users\[USER]\Desktop\id_rsa.pub /data/dropbear/.ssh/authorized_keys

 

3.) Android: SSH-Server aktivieren

adb shell

(adb shell)

chmod 600 /data/dropbear/.ssh/authorized_keys
echo "/system/xbin/busybox sh" > /data/dropbear/.profile
chmod 755 /data/dropbear /data/dropbear/.ssh
chmod 644 /data/dropbear/dropbear*host_key
chown root.root /data/dropbear/.ssh/authorized_keys
killall dropbear
dropbear -v -s -g

 

4.1) Linux: Verbindung herstellen

-> SSH mit public-key Authentifizierung

 

4.2) Windows: Verbindung herstellen

PuTTY Download Page

4.2.1) Download „putty“

4.2.2) Verbindung zu Android aufbauen

Connection: > „SSH“ > „Auth“ > wähle deinen gespeicherten „private key“ aus …

Session: > gib die IP-Adresse von deinem Android ein und drücke auf Enter

 

 

weitere Infos findest du hier:
Howto: Connect to Device with SSH – CyanogenMod Wiki

Tweak-Skript für Android / Spica

Ich habe hier ein kleines HowTo zum beschleunigen von Android / Spica geschrieben und wollte euch das Tweak-Skript für „bfs-Kernel“ / „cfs-Kernel“ / „Dateisystem“ (ext2) / „3G/Edge Speed“ … zur Verfügung stellen. -> Forum-LinkDownload

Optimized Android-Apps mit Linux erstellen

Ich habe meine apps mit dem folgenden Bash-Skript optimiert, welches die Bild- & Sound-Dateien komprimiert, so dass die Apps kleiner werden und weniger Speicher verbrauchen… :-)

Habe die optimierten Apps zu meinem Update-Pack für Spica hinzugefügt -> cyanogenmod + x

 

1.) Bash-Skript in einer Textdatei unter Linux speichern (Tweak_app.sh) & Ausführrechte setzen (chmod +x Tweak_app.sh)

2.) „optipng“, „pngcrush“, „sox“ installieren (z.B. für Debian: apt-get install optipng pngcrush sox)

3.) android-sdk herunterladen & sudo cp …..android-sdk/android-sdk/zipalign /usr/bin/

4.) Folgendes Verzeichnis anlegen und zu optimierende Apps darin speichern (./place-apk-here-to-batch-optimize/)

5.) Tweak-Skript ausführen (./Tweak_app.sh) -> Fertig


#!/bin/bash

LOG_FILE="apk.log"

if [ \! -f `whereis optipng | cut -f 2 -d ' '` ] ; then
	echo "ERROR: install optipng (apt-get install optipng)"
	exit 1;
fi;
if [ \! -f `whereis pngcrush | cut -f 2 -d ' '` ] ; then
	echo "ERROR: install pngcrush (apt-get install pngcrush)"
	exit 1;
fi;
if [ \! -f `whereis sox | cut -f 2 -d ' '` ] ; then
	echo "ERROR: install sox (apt-get install sox)"
	exit 1;
fi;
if [ \! -f `whereis zipalign | cut -f 2 -d ' '` ] ; then
	echo "ERROR: install zipalign (sudo cp ...android-sdk/android-sdk/zipalign /usr/bin/)"
	exit 1;
fi;	

rm -rf ./place-apk-here-to-batch-optimize/original/*
if [ -e $LOG_FILE ]; then
	rm $LOG_FILE;
fi;
touch $LOG_FILE
mkdir -p ./place-apk-here-to-batch-optimize/original
find ./place-apk-here-to-batch-optimize -iname "*.apk" | while read APK_FILE ;
do
	echo "Optimizing $APK_FILE"
	7za x -o"./place-apk-here-to-batch-optimize/original" $APK_FILE
	find ./place-apk-here-to-batch-optimize/original -iname "*.png" | while read PNG_FILE ;
		do
		if [ `echo "$PNG_FILE" | grep -c "\.9\.png$"` -eq 0 ] ; then
			optipng -o99 "$PNG_FILE"
			pngcrush -rem alla -reduce -brute "$PNG_FILE" tmp_img_file.png;
			mv -f tmp_img_file.png $PNG_FILE;
		fi
	done;
	find ./place-apk-here-to-batch-optimize/original -iname "*.ogg" | while read OGG_FILE ;
		do
        	sox "$OGG_FILE" -C 0 tmp_audio_file.ogg
        	mv -f tmp_audio_file.ogg $OGG_FILE
    	done;
	7za a -tzip "./place-apk-here-to-batch-optimize/temp.zip" ./place-apk-here-to-batch-optimize/original/* -mx9
	FILE=`basename "$APK_FILE"`
	DIR=`dirname "$APK_FILE"`
	mv -f ./place-apk-here-to-batch-optimize/temp.zip "$DIR/optimized-$FILE"
	zipalign -v -c 4 "$DIR/optimized-$FILE";
	ZIPCHECK=$?;
	if [ $ZIPCHECK -eq 1 ]; then
		echo "ERROR $FILE" >> $LOG_FILE;
		#rm "$DIR/optimized-$FILE"
	elif [ $ZIPCHECK -eq 0 ]; then
		echo "OK $FILE" >> $LOG_FILE;
	else
		echo "ERROR $FILE" >> $LOG_FILE;
		#rm "$DIR/optimized-$FILE"
	fi;
	rm -rf ./place-apk-here-to-batch-optimize/original/*
done;

C-Programm – String (char) kopieren

Hier einige Möglichkeiten, einen String zu kopieren … :-)

#include <stdio.h>
#include <string.h>

/* --- 1. strcpy mit Arrays --- */
char *strcpy1(char ziel[], const char quelle[]) {
    int zahl = 0;
    // solange Zeichen von der Quelle vorhanden sind,
    // also quelle[zahl] ungleich 0 ist ...
    // (letztes Zeichen eines Strings ist immer \0 -> =0 -> false)
    while(quelle[zahl]) {
    // der Buchstabe aus dem Quell-Array wird
    // an die selbe Stelle ([zahl]) im Ziel-Array geschrieben
        ziel[zahl] = quelle[zahl];
    // zahl wird um 1 erhöht (zahl=zahl+1)-> nächster Buchstabe
        zahl++;
    }
    // der neue Sting wird abgeschlossen
    ziel[zahl] = '\0';
    return(ziel);
}

/* --- 2. strcpy mit Arrays --- */
char *strcpy2(char ziel[], const char quelle[]) {
    int zahl = 0;
    // solange der Buchstabe aus dem Quell-Array an die selbe Stelle ([zahl])
    // im Ziel-Array geschrieben werden kann, also quelle[zahl] ungleich 0 ist ...
    // (letztes Zeichen eines Strings ist immer \0 -> =0 -> false)
    while((ziel[zahl] = quelle[zahl]))
    // zahl wird um 1 erhöht (zahl=zahl+1) -> nächster Buchstabe
        zahl++;
    return(ziel);
}

/* --- 3. strcpy mit Zeigern --- */
char *strcpy3(char *ziel, const char *quelle) {
    // solange der Buchstabe vom Quell-Zeiger auf die selbe Stelle
    // vom Ziel-Zeiger zeigt ...
    // (letztes Zeichen eines Strings ist immer \0 -> =0 -> false)
    while((*ziel = *quelle)) {
    // Zeiger um einen erhöhen -> nächste Speicherstelle -> nächster Buchstabe 
        ziel++;
        quelle++;
    }
    return(ziel);
}

/* --- 4. strcpy mit Zeigern --- */
char *strcpy4(char *ziel, const char *quelle) {
    // solange der Buchstabe vom Quell-Zeiger auf die selbe Stelle
    // vom Ziel-Zeiger zeigt, so werden diese jedesmal um 1 erhöht ...
    // (letztes Zeichen eines Strings ist immer \0 -> =0 -> false)
    while((*ziel++ = *quelle++));
    return(ziel);
}


int main(void) {
    char *gruss = "Hallo Welt";
    char gruss1[100];
    char gruss2[100];
    char gruss3[100];
    char gruss4[100];
    char gruss5[100];

/* --- 1. strcpy mit Arrays --- */
    strcpy1(gruss1, gruss);
    printf("%s\n", gruss1);
/* --- 2. strcpy mit Arrays --- */
    strcpy2(gruss2, gruss);
    printf("%s\n", gruss2);
/* --- 3. strcpy mit Zeigern --- */
    strcpy3(gruss3, gruss);
    printf("%s\n", gruss3);
/* --- 4. strcpy mit Zeigern --- */
    strcpy4(gruss4, gruss);
    printf("%s\n", gruss4);
/* --- 5. strcpy -> <string.h> --- */
    strcpy(gruss5, gruss);
    printf("%s\n", gruss5);

    return(0);
}

C-Programm – check_mem für Nagios

Habe gerade ein kleines C-Programm geschrieben, welches mithilfe von Nagios / Icinga die Speicherauslastung (Arbeitsspeicher + Swap) eines Linux-Servers überprüfen kann. Wenn ein Server seine aktuell laufenden Programm auf der Festplatte auslagern muss, da zu wenig Arbeitsspeicher zur Verfügung steht, sollte man darüber ggf. informiert werden… :-)

/*****************************************************************************
* 
* Nagios check_mem plugin
* 
* License: GPL
* Copyright (c) 2000 Karl DeBisschop (kdebisschop@users.sourceforge.net)
* Copyright (c) 2000-2007 Nagios Plugins Development Team
* Copyright (c) 2011 Lars Moelleken (voku@voku-online.de)
* 
* Description:
* 
* This file contains the check_mem plugin
* 
* 
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* 
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
* 
* You should have received a copy of the GNU General Public License
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
* 
* 
*****************************************************************************/

const char *progname = "check_mem";
const char *NP_VERSION = "0.1";
const char *copyright = "2011";
const char *email = "voku@voku-online.de";

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/sysinfo.h>

void print_usage (void);
void print_help (void);


int main (int argc, char *argv[]) {
    long total = 0, free_total = 0, used_total = 0;
    long total_mem = 0, free_mem = 0, used_mem = 0;
    long total_swap = 0, free_swap = 0, used_swap = 0;
    struct sysinfo meminfo;

    char *warn_percent = NULL;
    char *crit_percent = NULL;

    int STATE_OK = 0;
    int STATE_WARNING = 1;
    int STATE_CRITICAL = 2;
    int STATE_UNKNOWN = 3;
    int result = 0;

     if (argc < 2) {
        print_help();
        printf("Hilfe anzeigen lassen: %s -h\n", argv[0]);
        exit(STATE_UNKNOWN);
    }

    char option;
    while((option = getopt(argc, argv, "hwc:")) != EOF) {
        switch(option) {
            case 'h':
                print_help();
                break;
            case 'w':
                warn_percent = argv[2];
                break;
            case 'c':
                crit_percent = argv[4];
                break;
            case ':':
                printf("option needs a value\n");
                break;
            case '?':
                printf("unknown option: %c\n", optopt);
                break;
        }
    }

    if(sysinfo(&meminfo) !=0) {
        perror("Fehler ...");
    }

    total_mem = meminfo.totalram;
    free_mem = meminfo.freeram;
    used_mem = meminfo.totalram - meminfo.freeram;

    total_swap = meminfo.totalswap;
    free_swap = meminfo.freeswap;
    used_swap = meminfo.totalswap - meminfo.freeswap;

    total = total_mem + total_swap;
    free_total = free_mem + free_swap;
    used_total = used_mem + used_swap;

    if (free_swap < total_swap/2 || free_total < total / 100 * atoi(crit_percent)) {
        printf("CRITICAL > ");
        result = STATE_CRITICAL;
    } else if (free_total < total / 100 * atoi(warn_percent)) {
        printf("WARNING > ");
        result = STATE_WARNING;
    } else {
        result = STATE_OK;
        printf("OK > ");
    }
    printf("Free Mem+Swap: %ld - Free Mem: %ld - Free Swap: %ld", free_total/1024/1024, free_mem/1024/1024, free_swap/1024/1024); // test-Ausgabe
    return result;
}


void print_help (void) {
    printf ("%s\n", "Check memory on local machine.");

  printf ("\n");

    print_usage ();

  printf (" %s\n", "-w PERCENT%%");
  printf ("    %s\n", "Exit with WARNING status if less than PERCENT of mem/swap space is free");
  printf (" %s\n", "-c PERCENT%%");
  printf ("    %s\n", "Exit with CRITCAL status if less than PERCENT of mem/swap space is free");
    printf ("\n");
}


void print_usage (void) {
  printf ("%s -w <percent_free>%% -c <percent_free>%%\n",progname);
}

„Yahoo Pipes“ und andere Informationsquellen

Durch die Kommentare auf einen alten Blog-Post „News im Internet suchen / filtern /finden“ wo ich mich mit dem Google-Reader, Newsletter, Twitter… beschäftigt hatte, bin ich durch blog.posativ.org auf „Yahoo Pipes“ gestoßen!

 

Am Anfang stelle ich erst einmal das Endergebnis vor, eine Zusammenfassung einiger Tech-Blogs:

IT-Blogger über Linux: http://pipes.yahoo.com/pipes/pipe.run?_id=f537df8f186dafe15ee88fa01ec110c2&_render=rss

 

1.) RSS-Feeds zusammensuchen

Unter meinen Quellen waren einige Feed aus meinem Google-Reader

Tipp: Unter („Einstellungen“ > „Reader-Einstellungen“ > „Ordner und Tags“) kannst du deine Ordner öffentlich machen. ;-)

-> IT-BloggerIT-NewsIT-PodcastsLinuxHackingPolitikLesenswert

Dann habe ich noch einige URLs aus meinen Twitter-Listen zusammenkopiert und schon hatte ich so viele Informationen, dass man Stunden benötigen würde, um die Webseiten einzeln zu besuchen und sich die neusten Infos zusammenzustellen.

-> IT-BloggerIT-NewsIT-PodcastsLinuxHackingPolitikLesenswert

 

feed
feed

 

2.) RSS-Feeds filtern und sortieren

Auch wenn die Doku von „Yahoo Pipes“ gut ist und es sogar einige Video-HowTo’s gibt, ist das meiste selbsterklärend und man kann vieles einfach ausprobieren, da man zum einen eine Debug-Konsole erhält, wenn man auf ein Element kickt und zum anderen sich viele andere Beispiele finden lassen, wo man sich die Konfiguration anschauen & kopieren kann, um diese für seinen Zweck anzupassen. z.B.: http://pipes.yahoo.com/pipes/pipe.info?_id=f537df8f186dafe15ee88fa01ec110c2 -> View Source & Clone

 

filter
filter