If you want to learn to program then C. That's right learn C. C is the language that the operating system you're using is written in, not to mention several of these other programming languages (the main implementation of Python or Ruby, for example). Is this language easy? No. Is it right for newbies? Maybe, maybe not. If you want the least amount of abstraction and don't want a bunch of stuff in your way, learn C. It's a hair's breath from learning assembly, and you can get a free compiler for it on any operating system.
If you want to get stuff done quickly, learn Python or Ruby.
Having programmed in both C and assembly, I wouldn't say "a hair's breadth" is an accurate characterization. It looks like a high level language, and it's easy to use it like one. But it's equally easy to misunderstand C's semantics, they're often subtly different from what you'd expect. An obvious example is the array[index]. There are complicated syntax rules required to do some fundamental things, such as passing parameters by reference. Strings are a nightmare, and of course don't forget malloc() and free().
I only recommend learning C first if you have handy: an excellent instructor or an excellent book-- preferably both. I might also recommend C if you already know a lot about how computers work architecturally but don't know much about languages.
With python and ruby, just go to www.python.org or www.ruby-lang.org. Several good resources have been mentioned for Scheme. In those cases, you'll get familiar with the basic idea of telling the computer what to do, as well as fundamentals like expressions and abstractions. Going the SICP+Scheme route will introduce you to recursion and high-order functions fairly quickly, while Ruby and Python have all sorts of practical libraries. Interpreters for Javascript are more readily available than C compilers, though at the moment I can't recommend an ideal place to go learn about it. JS is everywhere though.
I love C, and think that an undergraduate Computer Science curriculum should require learning it early on. But for someone who wants to learn to hack on their own, C is probably not the best choice.
I'm surprised that people disagreed with my C recommendation (although, note that I did say Python or Ruby if you want to get something done quickly). Learning C isn't really about learning C, it's about learning how the computer actually does things (aka pointers, memory management, etc.). Knowing C lets you understand concepts in higher level languages easier. For example, "pass by reference" is easy to understand once you have passed around some pointers. It helps you understand what the garbage collector is doing, and why it's doing it. It helps explain why even in managed languages sometimes you need to "free()" something (an example is bitmaps in C#).
Would you rather start programming on the surface (not knowing what is happening underneath) or would you rather start by learning the hard stuff underneath? I, personally, would rather know what is happening underneath. Is there an argument for learning the more surface stuff first? Maybe I'm off nuts and have a slanted view because I learned Java, Scheme and then C.
C is a valuable language for a large class of problems. But don't learn it unless you want to be a real serious systems-level software engineer. If you just want to write software for the web (even large-scale apps), don't waste months on the intricacies of pointer arithmetic and memory management.
That said, I learned C, and it didn't hurt me any. But I doubt it really helped much either.
If you want to get stuff done quickly, learn Python or Ruby.