在Linux上启动什么语言?[关闭]


19

我即将在普渡大学开始四年制的信息安全学位。该学位不要求任何编程课程。因此,我唯一能够参加的就是偶尔的选修课。因此,我的大部分学习将取决于我自己。高中三年级开始时,我决定完全转向Linux。到目前为止,我一直在学习一些Linux和安全性方面的知识。但是,我也相信对我来说,学习一些编程语言也很重要。

基本上,我计划学习与如何使用Vim并排编程。因此,这很可能将是一个缓慢的过程。最后,我认为这是值得的。就像我说的那样,我正在研究安全性,因此我将主要创建与安全性相关的应用程序,其中大多数与网络相关。我也想开始开发Android应用程序,但这将在以后进行。

话虽如此,我有一些想法。我正在考虑从JavaScript入手,因为它是跨平台的,并且我之前已经看到过它的建议。我也听说过很多关于Ruby的信息,或者可以选择使用C语言走自然的Linux路线。我应该朝哪个方向发展?

Answers:


53

首先,是:bash以及常见的命令行实用程序。Bash是操作系统的默认用户界面,Linux系统上的许多程序在某种程度上都将包含在Shell脚本中。它可能很古怪,有一些特质,而且常常看起来很愚蠢,但这是您必须处理的事情,因此请放心使用。标准的工具,如grepdiffheadtailsortuniq,等,将不仅与shell脚本,但在命令行您的工作效率非常有帮助。

至少学一些c。这是系统最低层的内容,它将使您更好地了解整个系统。

选择您喜欢的任何高级语言。Pythonrubyperljava,不管-只要你喜欢它。这是您真正开始学习如何“编程”的地方,从这里开始,选择更多的语言并继续学习将变得更加容易。


2
我同意这里列出的所有观点。

6
如果您要学习bash,则应包括以下方面的知识:awk,sed,头部,尾部,剪切,tr,diff,grep,find,ps,netstat,tcpdump,sort,uniq等,等等,等等
jftuga 2011年

2
@jftuga同意。我的工具箱中有很大一部分是用于执行“数据提取和集成”的技能-一种表达“操纵格式化的文本文件”的奇特方法。一旦了解了管道并了解了通用工具,您便不受任何预发布软件的工作流程的束缚。我还是MS Powershell的忠实拥护者,在许多方面它都站在Bash的肩膀上。
2011年

@jftuga-注明。尽管我认为这些很重要,但我认为linux新手不必担心深入学习sed / awk之类的大手笔,但他们应该有足够的理解能力,以便能够在遇到现有代码时对其进行解密。 。
JimB 2011年

8
所有人都同意,但我建议将Python优先于其他语言,因为它已经成为服务器管理工​​具中最常见的高级语言。与ruby或java相比,您遇到它的频率更高。Perl也很常见,因为它太旧了,所以我接下来再选一个。
tylerl 2011年

10

您会发现几乎每个人都会推荐他们喜欢的语言。我最喜欢的语言是Perl,所以这是我推荐的语言。:)但是,除了我个人的偏爱之外,还有一些重要的原因使您应该考虑使用perl:

首先,perl是一种很棒的通用语言。通过编写简单的脚本来完成与shell脚本中相同的工作,例如操纵文件并根据用户输入做出决定,就可以很容易地在perl中入门。这为编程的一般思想提供了一个非常容易且逐步的介绍。Perl已经存在了很长一段时间,因此有很多资源(书籍和网站)可供入门。

其次,perl是一种功能强大且表现力强的语言,支持所有现代编程功能。我使用它已有15年以上,但我仍在学习提高效率的新方法。例如,如果您想探索面向对象的编程,perl会提供(特别是通过Moose)。

第三,perl带有其官方附加存储库CPAN几乎无限的功能和灵活性。例如,要遵循编写安全软件的想法,您要开发某种自定义网络安全扫描程序。您可以先使用NMAP :: Scanner作为扫描引擎,然后再编写自己的调整和改进,而不是自己编写所有内容。

最后,如果您想探索Web编程,Perl也有。使用Perl编写Web软件的一种流行的现代方式是Catalyst,它提供了一种现代的MVC Web框架,用于快速开发任何类型的Web应用程序。

综上所述,perl的优点在于,它使您可以开始编写一些小的命令行脚本和程序,并逐渐成长为编写功能齐全的现代应用程序。当然,这种灵活性的代价是复杂性。学习和学习如何以正确的方式做事取决于您,Perl不会像其他语言那样强制执行良好实践。我个人喜欢这种自由,特别是与网络上所有用于学习如何使用perl的强大资源结合在一起。


Perl是一种(主要)脚本语言;和大多数的操作系统是程序性的C.
克里斯小号

当然可以,但是在这个问题中,我认为这并不重要。听起来并不是OP真正想要或需要学习OS级编程的。
Phil Hollenback

我建议Perl是为安全应用程序编写代码的好方法,该安全应用程序以您已经了解的用另一种语言(通常为C)编写的内容为目标。因此,如果这种区分有意义,我会将Perl归类为您应该学习使用的工具,而不是应该(完全)理解的语言。
BMDan 2011年

6

三种语言会让您保持稳定。按照重要性从高到低的顺序排列(即,第一个是最重要的):

  1. 伪代码。通常,您使用的实现是六种语言和工具的混合物,只有其中一些您会直接知道。但是,如果您知道实施的是哪种模式,则可以弄清楚将什么输入交给一块,应该提供什么输出,进行排他性测试,然后弄清是否是断裂的部分。
  2. Ç。不管是好是坏,这都是运行(Linux)Universe的原因,它使您可以从根本上了解事物,您可以了解任何高级语言的实际作用(例如,PHP的引用传递或Java的线程模型)。
  3. 除C ++外,几乎所有其他内容。像SQL或更好的是Haskell之类的功能语言,或者不像C-ey那样的语言-如果所有其他方法都失败了,Java可以解决这个问题,但是它仍然非常程序化-在这里获得很高的评价;这个想法是将您的大脑包裹在与您之前所做的完全不同的事情上,您会不由自主地意识到自己之前所做的事情的局限性。就纯粹的实用程序而言,bash可能也属于此列表,但是如果您没有其他基础,则最终只能使用bash语法编写C而不是真正探索其功能。

1
+1为伪代码。我喜欢在注释中伪编码,然后在注释周围编码
sreimer 2011年

2
+1为伪代码和“除C ++之外的其他任何东西”。在linux world中,您应该至少学习一个script language,例如pythonPHP
yegle 2011年

2
我不知道伪代码对初学者是否是一个很好的建议。在学习了几乎所有c风格的语言之后,伪代码将是可以理解的,那么人们应该真正地努力学习伪代码吗?更不用说,没有单一的伪代码语法,这很可能会使初学者感到困惑。
JimB 2011年

@JimB:重点是学会逻辑思考,而不管语言如何。ERD,UML等是执行此操作的象牙塔工具,但是您不必学得那么正式。想法是学会勾勒出您的想法,然后将其与预期结果进行比较。例如,当您意识到数据库没有(固有)方式知道哪些HTTP标头作为请求的一部分发送到Web服务器时,可以从考虑中消除一个变量。同样,当您为函数编写伪代码时,通常会发现边缘情况和其他情况。
BMDan 2011年

我完全同意,我只是认为将初学者指向“伪代码”将引起混乱,因为这不是正式的事情。大多数人的伪代码将融合他们最熟悉的c样式语言以及一些特殊语法。
JimB 2011年

4

您应该学习几种语言。我建议从Python开始。广泛建议您使用它,因为它易于学习且非常有用,许多免费的出色的自学资料都是免费提供的,并且我收集到它被IT安全专业人员广泛使用。几乎每当我看到安全专家发布演示代码时,便是Python。


+1用于python,Python不仅在Linux世界中很流行。

4

我即将在普渡大学开始四年制的信息安全学位。该学位不要求任何编程课程。

我是唯一想到OMG的人吗!!!!在此刻?

我也相信学习一些编程语言对我来说很重要

我会这样说。尽管您并不是真正希望成为一名熟练的程序员,但是您可能需要模拟/重新创建攻击并理解编程过程如何工作所需的技能。您还将需要技能来分析数据,并从大量资源(如日志)中提取信息。JimB提到过bash-尽管您无疑会使用它,但它只需要花费几个小时即可学习基本信息。实际上,您唯一可能会看到bash的地方是在Linux系统上-但是其他shell非常相似。

我建议学习awk和/或Perl进行数据处理。不要为勾选一个面向对象的框而烦恼,但是我建议您也考虑一下非过程语言。

学习C语言还将使您了解有关代码如何变成可执行程序的大量信息(编译只是非常复杂的过程中的一个步骤)。

对Android /移动开发感兴趣的人的明显选择是java-但是java试图使开发人员不必处理操作和协议的现实,这是我的经验,这就是Java遇到安全问题的地方应用。也就是说,它可能帮助您实现最终目标,并且在您的简历上看起来不错,但是不要指望学习Java来补充您的安全知识。


1
你并不是唯一的一个。:-o
Keith

2

我的建议:

  • bash(及其同类)不是通用编程语言。虽然可以完成一些复杂的脚本编写工作,bash但这并不是一般学习编程的最佳方法。这是完成系统管理任务的最自然的方法,该任务主要围绕执行其他程序,处理它们的数据文件和目录以及对进出它们的输入和输出进行编组。如果bash是锤子,请将其保留在确实看起来像钉子的问题上。学习做任何不平凡的bash,如果你了解一些非常小的子集,将是相当容易sedawk(因为在字符串操作bash通过类似的操作在这些“小”语言的语法在很大程度上启发)。
  • 对于Linux下的通用编程,您会听到许多热情的争论。最好的两个竞争者是PerlPython。这些都是通用的非常高级的脚本语言,它们公开了足够的低级功能来执行几乎系统上任何用户空间进程可以访问的任何操作,并且具有大量的预写模块和库。

我建议你读℃的介绍性文字,并花一些时间运行strace,并ltrace像一些简单的实用程序命令的命令lsmkdir/bin/echo等(其实这几天我会建议ltrace -S代替strace,但进军的命令和到输出该选项ltrace增加的输出-S将非常有教育意义)。

C是编写Linux内核和GNU libc的主要编程语言。(小零件正在组装中)。Linux(或其他类似UNIX的)系统上的几乎所有程序都与C库(libc)链接在一起。主要的Perl和Python解释器(以及大多数其他脚本语言)也是用C编写的。这些程序(内核,通用系统库和各种脚本语言解释器)都是由C程序员编写的,它们的设计和功能受到了很大的影响通过其基本实现。因此,对其中任何一个的更深入的了解最终都需要对C的理解。您不需要了解C ++或Java的任何知识就可以了解此级别的编程。(根据您的职业生涯,这些可能各有各的趣味和必要之处,

因此,如果您到目前为止同意我的前提,那么我们将其归结为Perl和Python之间的选择。

这是真正的火焰战争开始的地方。

我的建议是首先关注Python(2.x)。Python具有相对简单且一致的语法。您可以在几小时内学习Python 语法的基础知识,这是您将遇到的绝大多数语法。只有很少的功能(列表推导,生成器表达式,修饰符)对基本语法有影响。因此,您在学习Python上所做的大部分工作将致力于学习广泛的标准库,并尝试找到使用它们的“最佳”方法(并弄清楚哪些特殊的异常集值得处理以使您的程序健壮起来)最重要的是学习基础概念。

我认为Python的扩展库和相对简单的语法确实有两个明显的缺点。

首先,当您在Python的高层次学习如何做事时,您可能会发现必须在较低层次上工作的想法很繁琐。我在Perl工作的地方是标准。我使用Python编写了工作原型,据我所知,它可以比Perl更快,更可靠地工作。然后我就不得不为同事将它移植到Perl上而感到恐惧。(在使用Python之前,我在Perl方面相当出色,所以这不是简单的熟悉程度)。

另一个缺点是有时很难找到最高级别的方法来完成Python中的给定任务。例如,要获取网页,您可能最初尝试使用低级套接字...来工作。但是,您将复制很多已经可以找到的代码,包括urllib和和/或urllib2模块中的代码。从2.7.1版本开始,标准库就包括了这两个事实。Python的维护者在可能的情况下透明地扩展了较旧的模块和API;但是在很多情况下,Python保留了两个或三个模块,由于某种原因,它们无法进行透明扩展。(另一个例子,你可以看一下选项解析命令行选项:argparseoptparse,和getopt。使用getopt(其中最早的)编写程序几乎没有害处。对于非常简单的实用程序,几乎没有选项,并且有严格的调用约定(例如,仅由一小群人使用),那么遍历sys.argv自己并没有什么本质上的错误。但是,通常值得仔细阅读文档并遵循较旧或较低级别模块底部的链接,这些链接描述了可用的较新或更高级别的功能。

我的建议是基于我的意见,即您希望专注于更深层次的概念,而不必花费大量时间和精力在语法和语言特定问题上。理解何时使用子进程,线程而不是线程,或者了解Python随附的多处理功能与语言无关,而与语言熟练程度无关,而与语言无关。(通过与线程和多处理的比较,您可以了解Twisted事件驱动模型的参数,这时您可能已经精通Python并可以使用任何语言进行编程了)。

对于Perl,反论点既简单又实用。还有很多工作,特别是Perl技能。Perl是一种功能强大的语言,并且具有极其丰富的库。(与大多数Python系统相比,大多数Linux系统所分发的Perl的核心功能覆盖范围更小;假定您将通过发行版或通过CPAN安装大量其他软件包---全面的Perl存档网络)。(相比之下,我需要分别获取的Python模块和软件包更少了……这些可以从PyPI中获得--- Python Package Index)。

因此,如果您学习Perl,则可以在短期内找到工作,特别是sysadmin职位。但是,Perl的语法是……好吧……用一些自己的爱好者的话来说……“病态折衷!” Perl可能非常简洁,其代码充满了很多标点符号。那些喜欢它的人会无休止地争论说它是“容易的”并且是很有意义的---并且在充满困惑的特定论坛中,将有无数的机会这样做。文档中使用的语法和语言以及在公共论坛上支持该语法和语言的人都细微到您可以花费大量精力来学习它们的程度。

现在,请意识到前面的评论是主观的和有偏见的。您可能会尝试Perl并发现它的语法既直观又令人愉悦。如果是这样,您将获得更多动力。但是,我个人发现,我对Perl特质的掌握程度很快下降。我保留了基本原理,但是当我不得不改回多行代码时,我发现这很艰难。

您将学习许多其他语言,包括Java,Lisp和Scheme,TCL,Scala等。但是,我建议从实用性和简单性之间达到最佳平衡的方法开始。


1

在Linux世界中,您应该了解两个基本知识:

  1. Regular Expression。这是必须的。RegEx是一种通用的“语言”,一旦您知道如何使用正则表达式,您的生活就会变得更加轻松:-)
  2. quick & dirty”在Linux世界中很常见。如果您可以完成工作,那么无论您的解决方案多么丑陋,您都可以完成工作。

所以,如果你想学习Linux上的语言,你应该选择一个script language,像pythonPHP或甚bash scripting

并且,我的建议是PHP。简单又丑陋。它有详细的在线手册。它有很好的RegEx支持。就这样。


2
那一定是我所听过的对PHP的最好描述...当您普及之后,它背后还没有剩下很多东西:P
Gordon Gustafson

有点偏离主题,但是我认为PHP受欢迎的主要原因是许多分散在其他语言中的链接程序库/程序包中的功能是PHP的标准功能(有点像捆绑大多数您需要的功能) libc)
Phil Lello

1

您几乎可以用任何一种语言执行几乎所有任务,因此正确的选择很大程度上取决于您要解决的问题。

绝对值得了解以下类别的语言:

  • 编译语言(如C / C ++ / Java)。C / C ++是探索缓冲区溢出,堆栈损坏等安全问题的好地方。
  • 解释的语言(如PHP)。一个探索变量类型松散的问题的好地方,并且在调用它们之前不要检测未定义的函数
  • 脚本语言(sh / bash / csh / ksh)。对于将许多有用的Shell实用程序(请参阅/ bin&/ usr / bin)粘合在一起非常有用

我会努力学习C / C ++,因为这会导致堆栈损坏和直接内存访问。如果要试验安全性问题,这很重要。许多语言都有类似C的语法(包括JavaScript),因此这是一个很好的跳板。

如果您在shell中进行大量工作(我想您正在学习vim时就是这样),那么最终您将不得不学习shell基本脚本。UNIX Power Tools是一本不错的书,可以学习更多高级知识。我不知道它是否仍然出版。

PHP也是一种很好的学习语言。它为新程序员提供的主要优点是内置了许多功能,而不是需要链接到的库中(这不是一个复杂的任务)。因此,浏览主要文档将教给您许多知识


1

首先,一些负面建议:

基本上,我计划做的是学习与如何使用Vim并排编程。

不要那样做。找到一个真正舒适的编辑器。学习语言和编辑器要比按顺序学习它们困难三倍(显然,编辑器应该先走:-))

正如我所说的,我将进入安全领域,因此我将主要创建与安全相关的应用程序。其中大多数将与网络相关。

与网络相关的安全应用程序?C在这里毫无道理。您将需要在系统API级别上访问网络,这意味着要使用C。当然,这并不意味着一切都必须在C中-C库+ $favorite-high-level-language包装器可能会在不需要C的部分中为您节省与C相关的麻烦。

话虽如此,我有一些想法。我正在考虑从JavaScript入手,因为它是跨平台的,并且我之前已经看到过它的建议。

我敢打赌这是在与您不同的背景下提出的。JavaScript有其优势,但目前还不是一种好的通用语言。JS没有可与C,Python,Perl,Ruby,Java&company相比的标准库。

谈到$favorite-high-level-language-我的建议是使用Python。它与C的接口很好,它附带了许多有用的库,并且有很多库可以作为附件使用。


0

学习JavaScript没什么错,但它只能在浏览器下运行,因此您的编程将仅限于与网页相关的应用程序。

关于“什么是良好的编程语言开始”的答案可能与存在的语言一样多。我的最大价值是,与开始使用基本的Shell脚本相比,您可能会做得更糟,只是看到可以在不使用Shell以外的任何东西的情况下自动化任务的方法,然后使用Perl或出于需要而产生的类似语言进行扩展在那之后,比Shell所能完成的任务更加复杂的任务。如果您真的很感兴趣,只需几周的时间,就可以开始使用C或派生类了。


3
仅在浏览器上?没有了
EEAA 2011年

谢谢,我已经纠正了,但是我仍然不建议将Javascript作为学习环境,对于初学者来说,获得对非浏览器版本的支持将是一场噩梦。
blankabout 2011年

2
我一直认为ECMAScript是编程语言,而Javascipt位于ECMAScript之上,可提供用于操纵DOM的有用功能。Javascript适用于浏览器。
乔纳森·梅哈克

0

我的建议?嗯 好吧,您可能必须自行决定。对于有益健康,全面的范围,您可以按照通常的CS学位途径,也许不按此顺序。

(1)C / C ++-您可以简化面向对象的知识,至少您会尝试过。C ++是“专业”标准。(2)组装(只需要一点点-它可以帮助您了解处理器,内存等的真实工作原理-您不必嫁给它。)(3)Python / Perl / Bash-获取这些降低脚本语言的使用率,它们将对您的Linux(4)PHP / Ruby,MySQL和HTML级别最有用-只需进行Web编程即可!您将了解整个服务器-客户端交互过程,即另一种计算级别。

需要有用的概念吗?人工智能,神经网络。这些应该使您满意。

您可以选择其中一项进行操作,也可以触摸所有内容。我的语言?所有这些程序都可以根据需要提供,但是我从1984年开始就进行编程,并且拥有CS学位,书面游戏和各种嵌入式系统应用程序。是我做的 您需要找出自己是谁,做什么。只要确保您玩得开心。

请享用!


0

糟糕,信息系统的信息安全性被误读...哦,嗯,大多数情况仍然适用

爪哇

  1. 必须有一个基于Java的入门级编程课程,该课程将计入您的学位课程。总是很高兴获得您正在学习的课程的积分。
  2. 如果您厌倦了严格地成为系统专家,或者您后来工作的公司决定系统就像烤面包机,那么运行它的人也会为您带来一些职业发展。
  3. 面向对象
  4. 您说您想进行一些Android开发。这将意味着Java。

老实说,如果您在Linux上工作,并开始学习Java编程课程,然后再继续学习其他编程课程,那么其他工具(如Bash sed / awk等)应该会逐渐完善。如果您真正进入系统,则可以稍后再购买一些C,但我不会说它的需求量很大,我什至不会说这是成为系统专家的要求-除非您真的是内部人员。

青年汽车

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.