我即将在普渡大学开设4年的信息安全学位。 学位不要求任何编程课程。 所以我唯一能拿的是偶尔的选修课。 所以我的大部分学习将是我自己的。 在高中一年级的时候,我决定彻底改用Linux。 到目前为止,我一直在学习一些Linux和安全的东西。 不过,我也相信对我来说学习一些编程语言也是很重要的。
基本上我正计划学习如何使用Vim并行编程。 所以这很可能是一个缓慢的过程。 但最终我认为这将是值得的。 正如我所说,我正在进入安全领域,所以我将主要创build与安全相关的应用程序,其中大部分将与networking相关。 我也想开始开发Android应用程序,但是这将在后来的道路上。
这样说我有几个想法。 我正在考虑从JavaScript开始,因为它是跨平台的,我曾经看到过它的build议。 我也听到很多关于Ruby的信息,或者可以和C一起走自然的Linux路线。我应该走什么方向?
首先是: bash
,以及常见的命令行工具。 Bash
是操作系统的默认用户界面,Linux系统上的很多程序将被封装在某个级别的shell脚本中。 它可能会古怪,有一些特质,往往看起来很愚蠢,但这是你必须处理的事情,所以适应它。 像grep
, diff
, head
, tail
, sort
, uniq
等标准工具不仅对shell脚本非常有用,而且对命令行的生产率也很有帮助。
至less学习一些c
。 这是系统最底层的内容,它会让你更好地理解整个系统。
select你喜欢的任何更高级的语言。 Python
, ruby
, perl
, java
,不pipe – 只要你喜欢它。 这是你真正开始学习如何“编程”的地方,从这里开始,学习更多的语言会更容易。
你会发现每个人都会推荐他们最喜欢的语言。 我最喜欢的语言是Perl,所以这就是我的build议。 :)但是,超出我个人的喜好,为什么你应该考虑使用Perl有一些很好的理由:
首先,perl是一个美妙的通用语言。 通过编写简单的脚本来完成perl脚本的开发很容易,就像在shell脚本中做类似的事情一样,例如操作文件并根据用户input做出决定。 这为编程的一般思路提供了一个非常简单和渐进的介绍。 Perl已经有相当长的一段时间了,所以有很多资源(书籍和网站)入门。
其次,perl是一个非常强大和富有performance力的语言,支持所有现代编程function。 我已经使用了十五年了,而且我还在学习新的方法来更高效地完成任务。 例如,如果你想探索面向对象的编程,perl有(特别是通过驼鹿 )。
第三,perl具有几乎无限的function和灵活性,它是官方的附加存储库CPAN 。 例如,要遵循编写安全软件的想法,假设你想开发某种定制的networking安全扫描器。 而不是自己编写所有的,你可以开始使用NMAP ::扫描仪作为扫描引擎,然后编写你自己的调整和改进。
最后,如果你想探索networking编程,Perl也有。 在Perl中编写Web软件的一种stream行的现代方法是Catalyst ,它提供了一个现代的MVC Web框架,用于快速开发任何types的Web应用程序。
综上所述,perl的优势在于,它使您可以从小编写小命令行脚本和程序,并逐渐发展为编写全function的现代应用程序。 当然,这种灵活性的代价是复杂性。 学习和学习如何以正确的方式做事情取决于你,Perl不像其他语言那样执行良好的实践。 我个人喜欢这种自由,特别是在Web上学习如何使用Perl的所有优秀资源。
三种语言将会保持良好的状态。 按重要性递减顺序(即第一个是最重要的):
你应该学习几种语言。 我会build议从Python开始。 它被广泛的推荐为易于学习和非常有用的,许多优秀的自学资料是免费的,我收集它被IT安全专业人士广泛使用。 几乎每次我看到安全专业人员发布演示代码时,都是Python。
我即将在普渡大学开设4年的信息安全学位。 学位不要求任何编程课程。
我是唯一一个想OMG的人! 在此刻?
我也相信对我来说学习一些编程语言也是很重要的
我会这样说。 虽然你并不想成为一名熟练的程序员,但你可能需要模拟/重build攻击所需的技能,并了解编程过程是如何工作的。 您还需要分析数据的技能,并从批量来源(如日志)中提取信息。 JimB已经提到了bash–虽然你毫无疑问会使用它 – 只需要几个小时的时间来学习基本的东西。 实际上,你可能会看到bash在Linux系统上唯一的地方 – 但其他的shell非常相似。
我build议学习awk和/或Perl进行数据处理。 不要打扰任何要勾选面向对象框的要求 – 但我会build议查看非程序语言。
学习C还会向您提供关于代码如何变成可执行程序的大量信息(编译只是一个非常复杂的过程中的一个步骤)。
对于那些对Android /移动开发感兴趣的人来说,明显的select应该是java–但是java很努力地让开发人员不必处理操作和协议的实际情况 – 我的经验是,这就是Java的安全问题应用。 即它可能帮助你实现你的最终目标,它会在你的简历上看起来不错,但不要指望学习Java来补充你的安全知识。
我的build议:
bash
(及其同类)不是通用编程语言。 虽然可以在bash
完成一些复杂的脚本,但这并不是学习一般编程的最佳方式。 这是完成系统pipe理任务的最自然的方式,主要围绕执行其他程序,处理它们的数据文件和目录以及封送input和输出。 如果bash
是一把锤子,那就把它留给看起来像指甲的问题。 如果学习sed
和awk
一些非常小的子集(因为bash
的string操作很大程度上受这些“小”语言中的类似操作的语法启发),学习在bash
做任何不平凡的事情将会相当容易。 我build议你阅读一个关于C的介绍性文本,并花费一些时间在一些简单的实用程序命令(如ls
和mkdir
和/bin/echo
等等)上运行strace
和ltrace
命令。(实际上这些天我会build议ltrace -S
代替的strace
但进入从这两个命令的输出,并进入ltrace
输出由-S
选项增强将是非常教育)。
C是编写Linux内核和GNU libc的主要编程语言。 (小零件正在组装中)。 几乎Linux(或其他类UNIX系统)系统上的所有程序都与C库(libc)链接。 主要的Perl和Python解释器(以及大多数其他脚本语言)也用C编写。这些程序(内核,通用系统库和各种脚本语言解释器)全部由C程序员编写,其devise和function受到很大影响由他们的底层实现。 因此,对这些任何一个的深入理解最终需要理解C.您不需要了解任何关于C ++或Java的知识,就可以理解这个级别的编程。 (根据你的职业生涯补丁,每个人可能都是有趣和必要的,但是C和C ++和Java之间的差异在很大程度上与你的系统的大部分程序和实用程序使用C正交。
所以,如果你同意我的前提,我们已经把它归结为Perl和Python之间的select。
这是真正的火焰战争开始的地方。
我的build议是首先关注Python(2.x)。 Python有一个相对简单和一致的语法。 您可以在几个小时内学习Python 语法的基础知识,这是您将遇到的绝大多数语法。 只有一些特征(列表parsing,生成器expression式,装饰器)是基本语法的皱纹。 因此,大部分学习Python的努力都将致力于学习广泛的标准库,并试图find使用它们的“最佳”方法(并找出哪些是值得处理的特定的exception集,以使程序健壮)最重要的是, 在学习基本的概念。
我认为Python的扩展库和相对简单的语法确实有两个明显的缺点。
首先,当你学习Python中如何处理高级的东西时,你可能会发现必须在较低层次上工作的思想是乏味的。 我工作的地方Perl是标准的。 我用Python做了我的工作原型,我知道我可以用Perl更快,更可靠地工作。 那么我就不得不经过我的同事把它移植到Perl上。 (在我使用Python之前,我在Perl方面performance相当不错,所以这不是一个简单的熟悉问题)。
另一个缺点是,有时候很难find在Python中完成给定任务的最高级别的方法。 例如,要获取一个网页,您可能最初尝试使用低级套接字…这将工作。 然而,你会复制相当多的代码,你可以在urllib
和/或urllib2
模块中find。 标准库,从2.7.1开始,包括这两个都是我的观点。 在可能的情况下,Python的维护者已经透明地扩展了旧的模块和API; 然而有几十个例子,Python保留了两个或三个模块,因为某些原因,透明扩展是不可能的。 (另外一个例子,你可以看看parsing命令行选项的选项: argparse
, optparse
和getopt
,使用getopt
(最老的)来编写程序几乎没有什么坏处,对于很less的选项和严格的调用约定(例如,只有一小部分人使用),那么你自己走过sys.argv
就没有什么本质的错误了,但是,通常值得仔细阅读文档,并遵循较老或较低级别模块底部的链接描述可用的更新或更高级别的function。
我的build议是基于我的观点,您希望专注于更深层次的概念,而不必花费大量时间和精力处理语法和语言方面的问题。 了解何时使用subprocess与线程,或Python中包含的多处理function与语言无关,而与编程能力无关,无论语言如何。 (通过与线程和多处理相比,你可以理解关于Twisted的事件驱动模型的观点,那么你可能已经掌握了Python并准备好用任何语言编程)。
对于Perl来说,反驳是简单实用的。 在那里会有更多的工作,特别是Perl的技能。 Perl是一种function强大的语言,具有非常广泛的库。 (与大多数Linux系统一起分发的Perl的核心function比标准Python库的function范围更小;假设您将从您的发行版或通过CPAN安装大量额外的软件包— Comprehensive Perl Archivenetworking)。 (相比之下,有更less的Python模块和包,我必须单独提取…这些可从PyPI — Python包索引)。
所以,如果你学习Perl,短期内你就会find工作,特别是系统pipe理工作。 然而,Perl的语法是……呃……用它自己的一些爱好者的话来说……“病态的折衷! Perl可以非常简洁,其代码充满了相当多的标点符号。 那些喜欢它的人会无休止地争辩说它是“容易的”,并且是完全合理的,而且在论坛中将会有无尽的机会,这些论坛充满了对于给定的代码片段如何被解释的困惑。 文档中使用的语法和语言以及在公共论坛中使用的语言的语法和语言细微差别,您可以花费大量的精力来学习它们。
现在请注意,这个评论是主观的,有偏见的。 你可能会尝试Perl,并发现它的语法是直观和愉快的。 如果是这样,给你更多的权力。 不过,我个人发现,我对Perl的特质的掌握迅速衰落。 我保留的基础知识,但我发现它是一个斗争,每当我不得不切换回几行代码。
还有很多其他的语言,Java,Lisp和Scheme,TCL,Scala等等。 不过,我build议先从实用性和简单性之间提供最好的平衡。
在Linux世界中,你应该知道两件基本的事情:
Regular Expression
。 这是必须的。 RegEx
是一种通用的“语言”,一旦你知道如何使用正则expression式,你的生活将变得更加容易:-) quick & dirty
”在Linux世界是非常普遍的。 如果你能完成你的工作,不pipe你的解决scheme多糟糕,你的工作就完成了。 所以,如果你想在Linux上学习一门语言,你应该select一种script language
,比如python
, PHP
,甚至是bash scripting
。
而且,我的build议是PHP
。 这很简单和丑陋。 它有一个详细的在线手册 。 它有良好的RegEx
支持。 就这样。
你几乎可以用任何语言完成任何任务,所以正确的select很大程度上取决于你正在解决的问题。
绝对值得从以下类别中学习语言:
我会努力学习C / C ++,因为这样会导致堆栈损坏和直接内存访问。 如果您想尝试安全问题,这一点很重要。 许多语言都有类C语法(包括JavaScript),所以它是一个很好的跳板。
如果你在shell中工作的很多,我想你就是在学习vim,最终你会学习shell基本脚本作为副作用。 UNIX电源工具是学习更先进的东西的好书; 我不知道它是否仍然发布。
PHP也可以成为学习的好语言; 它为新程序员提供的主要优点是内置了许多function,而不是在需要链接的库中(这不是一个复杂的任务)。 正因为如此,浏览主要的文档将教你许多事情。
首先,一些负面的build议:
基本上我正在计划要做的就是学习如何使用Vim并行编程。
不要那样做。 find一个真正舒适的编辑器。 学习语言和编辑是一样艰辛的学习他们(显然,编辑应该先去:-))
正如我所说,我正在进入安全,所以我将主要创build安全相关的应用程序。 其中大部分将与networking有关。
networking相关的安全应用? C在这里是一个没有道理的select。 您将需要在系统API级别访问networking,这意味着要走C路。 当然,这并不意味着所有的东西都需要用C $favorite-high-level-language
编写 – 一个C库+一个$favorite-high-level-language
包装器可能会将C相关的麻烦保存在不需要C的部分。
这样说我有几个想法。 我正在考虑从JavaScript开始,因为它是跨平台的,我曾经看到过它的build议。
我敢打赌,这是build议在不同于你的情况下。 JavaScript有其优势,但它不是一个好的通用语言,还不是。 JS没有与C,Python,Perl,Ruby,Java和公司可用的标准库相媲美的标准库。
说到$favorite-high-level-language
– 我的build议是使用Python。 它与C很好的接口,它附带了许多有用的库,并有更多的库可用作附加。
学习Javascript完全没有错,但它只能在浏览器下运行,所以你的编程仅限于网页相关的应用程序。
有多less种语言的答案可能就是“开始使用什么样的编程语言”。 值得一提的是,你可能会比开始使用基本的shell脚本更糟糕,只是看到你可以做什么来自动执行任务,而无需使用shell以外的任何东西,然后使用Perl或类似的语言来扩展它,比shell更复杂的任务,之后,如果你真的感兴趣,只需要几个星期,开始使用C或衍生物。
我的build议? 嗯。 那么,你可能不得不决定你走了。 对于健康的,全面的范围,你可以去通常的CS学位的路线,也许不是这个顺序。
(1)C / C ++ – 你可以得到面向对象的东西,至less你会尝试。 C ++是“专业”标准。 (2)汇编(只是一点点 – 它会帮助你理解处理器,内存等的实际工作 – 你不必和它结婚)(3)Python / Perl / Bash – 获取这些脚本语言,它们将对您的Linux(4)PHP / Ruby,MySQL和HTML最有用 – 只需开启您的Web编程! 您将了解整个服务器 – 客户端交互过程,另一个计算级别。
需要有用的概念? AI,neural network。 这些应该把你弄出来。
你可以select其中的一个来做或者触摸它们。 我的语言? 所有这些,根据需要,但我从1984年开始编程,并拥有CS学位,书面游戏和各种embedded式系统应用程序。 这是我做的。 你需要知道你是谁,你在做什么。 只要确保你玩得开心。
请享用!
哎呀,误读信息系统的信息安全…哦大部分这仍然适用
Java的
老实说,如果你在Linux上工作,开始用Java开发编程课程,然后也许跟上几个编程课程,其他的工具,如Bash sed / awk等应该排在适当位置。 如果你真的进入了系统,那么稍后你可能会得到一些C,但是我不会说这是一个需求很大的系统,我甚至不会说这是一个系统人员的需求 – 除非你真的关心内部。
因人而异