Displaying articles with tag bash
Posted by hank,
Thu Aug 07 02:49:00 UTC 2008
So, you have your Jailbroken iPod Touch or iPhone with 2.0 firmware running OpenSSH, and you have MxTube 1.5 or better, of course. What if you want one of those pesky videos that YouTube deletes all the time, like Paris Hilton For President? Or maybe you want a full movie on your iPod without having to sync to iTunes since you’re stuck in Linux Land. Well, here’s how:
Download the video
This can be done lots of ways, but somehow obtain a version of the video that ffmpeg can read. It can be just about any format. Let’s assume that we get a file called paris.flv.
Convert the video
ffmpeg -i paris.flv -b 500000 -s 176x144 -ac 1 -ab 64000 paris-high.mp4
This will make a nice movie for us to play. Let’s put it on the iPod:
scp paris-high.mp4 root@ipod:/var/mobile/Media/MxTube/
Make the Thumbnail
We need to grab a frame from the middle of the movie. Let’s use mplayer for that!
mplayer -vo jpeg -frames 1 -ss 30 paris.flv
This will make a file called 00000001.jpg. Let’s put that in the right spot:
scp 00000001.jpg root@ipod:/var/mobile/Media/MxTube/paris.thm
Add the video to the Library
Edit /var/mobile/Library/MxTube/VideoLibrary.plist on the iPod. Make a new dict entry in the list like so:
<dict>
<key>author</key>
<string>hank</string>
<key>duration</key>
<string>01:50</string>
<key>high</key>
<string>/var/mobile/Media/MxTube/paris-high.mp4</string>
<key>id</key>
<string>64ad536a6dQ</string>
<key>thumbnail</key>
<string>/var/mobile/Media/MxTube/paris.thm</string>
<key>title</key>
<string>Paris for President</string>
</dict>
Just fill in the right filenames for the thumbnail and movie like you used above. Also, change the author to yourself or the original director, and the duration accordingly. Keep the id something random. Also, you can change the display title as the last option there.
Other Pro Tips
Keep in mind that if you want to be able to delete the movie from the interface, you need to change the ownership on all the files to mobile:mobile using chown.
Results!
Well, it totally works, with sound even.


Good luck!
Tags: bash
Posted by hank,
Wed Aug 06 01:37:00 UTC 2008
Idea
I wanted to put images on my iPod Touch without using iTunes since, as most of us know, there is no good way to use it from Linux. It turns out there is a magic directory on the iPod Touch where it saves images from Safari. I simply looked at how it saved them, and applied it on my box here at home.
Requirements
- Jailbroken iPod Touch (I used WinPWN), with OpenSSH installed and working (the root password is alpine)
- Firmware 2.0 (Though, 1.x may work, I just haven’t tried it)
- A Linux box with a bash shell
- Cool images
convert and mogrify from ImageMagick installed
Method
These instructions might work for the iPhone as well. YMMV
All of your images must be in the format IMG_XXXX.YYY where XXXX is a number < 9999, and YYY is either JPG or THM (THM is a thumbnail). To rename our files, I use a simple trick I outlined in my last post:
EII=4; for i in *.jpg; do ls $i; \
NEWNAME=IMG_00`printf "%02d" $EII`.JPG; \
echo Renaming $i to $NEWNAME; \
mv $i $NEWNAME; EII=`expr $EII + 1`; done
That will rename all the JPEG files in order from 4 to, in my case, 62. Now, I have to make the thumbnails:
for i in `ls *.JPG | cut -d '.' -f 1`; do \
convert $i.JPG -resize 75x75! $i.THM; \
done
The 75x75! part makes sure they are exactly those dimensions. You end up with something like the following:
IMG_0004.JPG IMG_0016.JPG IMG_0028.JPG IMG_0040.JPG IMG_0052.JPG
IMG_0004.THM IMG_0016.THM IMG_0028.THM IMG_0040.THM IMG_0052.THM
IMG_0005.JPG IMG_0017.JPG IMG_0029.JPG IMG_0041.JPG IMG_0053.JPG
....
Now, note that the iPod can only display images under 100KB (to my knowledge). If your high-res image is too large, it will just display the magnified 75x75, which is really ugly. So, make sure all your images fit that description, and if they don’t, mogrify -resize them until they do (or take other measures as necessary). I used this:
mogrify -resize 400x *.JPG
All my images turned out to be between 30 and 90 KB. This also keeps the aspect ratio, unlike the 75x75!.
Now, SSH into your iPod (if you can’t do this yet, google it). You should have the following file:
/var/mobile/Media/DCIM/.MISC/Info.plist
Open this file in vi, and observe the plist>dict>integer part of the hierarchy:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>LastFileGroupNumber-100</key>
<integer>62</integer>
</dict>
</plist>
So, I put 62 in there since the last image I have is numbered 0062. It’s a very simple idea. Now, just load them onto the iPod:
scp IMG_00* root@ipod:/var/mobile/Media/DCIM/100APPLE/
Let’s have a look from the iPod console!
HanksTouch:/var/mobile/Media/DCIM/100APPLE root# ls
IMG_0002.JPG IMG_0014.THM IMG_0027.JPG IMG_0039.THM IMG_0052.JPG
IMG_0002.THM IMG_0015.JPG IMG_0027.THM IMG_0040.JPG IMG_0052.THM
Beautiful. Now, to test it…
Tags: bash
Posted by hank,
Wed Aug 06 00:34:00 UTC 2008
I made a cool one-liner in bash today that renames files sequentially. Here’s an example that takes all the JPEGs in a directory and renames them in order:
EII=4; for i in *.jpg; do ls $i; \
NEWNAME=IMG_00`printf "%02d" $EII`.JPG; \
echo Renaming $i to $NEWNAME; \
mv $i $NEWNAME; EII=`expr $EII + 1`; done
Pretty cool, huh? This is in relation to my next post. Keep watch…
Tags: bash
Posted by hank,
Sun Mar 30 21:16:00 UTC 2008
Today, I decided I wanted a network service that propagated variables and aliases to every login shell that subscribed to it. This is dangerous on a large scale, but perfectly acceptable on my small home network where everyone trusts everyone else.
First, I got Camping installed, bringing back fond memories of Ruby development. I then copied off the blog example, and created TreeHugger, a 427 line script that provides a web interface to edit the variables, and a plain text output for the shells to source.
This script, when run, allows some simple MVC actions to an sqlite3 database.

As you can see, I have some aliases here I want to send to all the subscribing hosts. Eventually, I want to add some detection functionality to the database (mostly reverse DNS lookups for host rule referencing). I just have to access /out to get my desired output:
# Treehugger Configuration
# Aliases
alias ai='sudo apt-get install'
alias aup='sudo apt-get update'
alias aug='sudo apt-get upgrade'
# Environment Variables
Now, to get this into bash. I looked into making the date command spit out pretty unique timestamps. Turns out you can do this with the nanoseconds format:
$ date +%s%N
1206926780157462141
I made it so wget saves the treehugger config to a tempfile using the somewhat random seed above as a filename suffix, and then I have my shell source it:
FILENAME=/tmp/treehugger-`date +%s%N`; 2>/dev/null wget -O $FILENAME http://rofl.who/treehugger/out && source $FILENAME && rm $FILENAME
And now I have nice aliases on my laptop served up from my desktop as fresh as the shell:
hank@davros:~$ alias
alias ai='sudo apt-get install'
alias aug='sudo apt-get upgrade'
alias aup='sudo apt-get update'
alias ls='ls --color=auto'
Tags: bash
Posted by hank,
Sat Dec 08 13:09:00 UTC 2007
Code
Here’s a quick one-liner using some UNIX utilities and Perl to construct some nice averages from CSV data:
for i in `seq 2 20`; do cat crim_rate_2005_by_state.csv | cut -d , -f $i | perl -e '$c=$d=0;$e;while(<>){if(/^\d/){$c+=$_;$d+=1}else{s/\s{2,}/ /g;s/"//g;chomp($e=$_);}} print $e, ": ", $c/$d, "\n"'; done
And now, the spaced out version:
#!/bin/bash
for i in `seq 2 20`; do
cat crim_rate_2005_by_state.csv | \
cut -d , -f $i | \
perl -e '$c=$d=0;
$e;
while(<>){
if(/^\d/){
$c+=$_;
$d+=1
} else {
s/\s{2,}/ /g;
s/"//g;
chomp($e=$_);
}
}
print $e, ": ", $c/$d, "\n"';
done
Output
- Population: 5775431.88461538
- Violent crime rate: 418.930769230769
- Murder/manslaughter rate: 5.59038461538462
- Forcible rape rate: 33.1634615384615
- Robbery rate: 114.455769230769
- Assault rate: 265.728846153846
- Property crime rate: 3339.50961538462
- Burglary rate: 685.671153846154
- Larceny/theft rate: 2273.43269230769
- Motor vehicle theft rate: 380.417307692308
- Violent crime: 26928.3461538462
- Murder and nonnegligent manslaughter: 335.730769230769
- Forcible rape: 1809.67307692308
- Robbery: 8128.30769230769
- Aggravated assault: 16654.6346153846
- Property crime: 196569.711538462
- Burglary: 41756.0961538462
- Larceny-theft: 130880.442307692
- Motor vehicle theft: 23933.1730769231
So, now we have our averages. More work to be done. The data file used is available here:
Tags: bash
Posted by hank,
Thu Jul 19 22:45:00 UTC 2007
This awesome page told me about the <<< operator in bash. It rocks. It also told me the best way to set an initial login password:
umask u=rw,go=
openssl rand -base64 6 | tee -a PasswordFile | passwd –stdin joe
chage -d 0 joe
Also, there’s ssh-copy-id:
Usage: /usr/bin/ssh-copy-id [-i [identity_file]] [user@]machine
Tags: bash
Posted by hank,
Sat Jul 14 20:17:00 UTC 2007
I use GNU Screen. A lot. I found an article linked from DIgg today that showed me how to use a setting called hardstatus to set the little bar at the bottom to my liking. I decided to mess around with it a bit, and I ended up with this:

It shows my hostname, IP, uptime, screen window number and name, date and time, and load averages. Pretty cool, huh?
This is how you do it:
- First, create a
.screenrc file and dump this in there:
hardstatus alwayslastline
backtick 1 60 60 /home/hank/.screen_hardstatus
hardstatus string "%{Gk}%H: %{+s y}%1` | %=%n: %t%= | %m/%d %c | %{+b}%l"
- Now, see the line that starts with backtick? That tells screen what program to run for assigning output to
%1` in the hardstatus string. Let’s make the .screen_hardstatus file as well (make it in your own home directory).
#!/bin/bash
# Script to get run by hardstatus in screen.
# Prints customized single-line system stats
IP=`ifconfig eth0 | grep Mask | cut -d: -f2 | cut -d " " -f1`
UPTIME=`perl -pe 's/^(\d+).*/sprintf("%d", ($1\/(24*3600)))." days"/e' /proc/uptime`
echo -n "$IP | Up: $UPTIME"
I cheated and used perl, but all of this could safely be converted to sed/awk easily. All this does is print my raw dotted quad IP address, a pipe, and then the current uptime in days rounded down.
- Now, just run
screen. You should see something similar to the first picture. I used this page a lot to customize the colors, etc.
Tags: bash
Posted by hank,
Sat May 19 04:06:00 UTC 2007
I thought this was pretty cool:
for i in `seq -f "%03g" 1 100`; do wget http://www.gozerog.com/images/Hawking_$i.jpg; done
We were trying to do this the other night using bash, but to no avail since the square brackets only work for local file path expansion. I should have remembered seq. Also, this example shows how to 0-pad a series using seq and bash, noted by the *-f* option. Three cheers for seq!
Tags: bash
Posted by hank,
Mon Mar 26 14:40:00 UTC 2007
I often find myself going to find scripts I’ve written that I want to edit, but I decided today I’d make things easier on myself:
hank@rura-penthe ~ $ cat bin/vimwhich
#!/bin/bash
vim `which $1`
All this does is shorten vim `which myscript` to vimwhich myscript. Helpful for just a couple lines of code.
Tags: bash