<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
     xmlns:atom="http://www.w3.org/2005/Atom"
     xmlns:dc="http://purl.org/dc/elements/1.1/"
     xmlns:wfw="http://wellformedweb.org/CommentAPI/"
     >
  <channel>
    <atom:link href="http://kitchingroup.cheme.cmu.edu/blog/feed/index.xml" rel="self" type="application/rss+xml" />
    <title>The Kitchin Research Group</title>
    <link>https://kitchingroup.cheme.cmu.edu/blog</link>
    <description>Chemical Engineering at Carnegie Mellon University</description>
    <pubDate>Sat, 01 Nov 2025 13:47:46 GMT</pubDate>
    <generator>Blogofile</generator>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    
    <item>
      <title>A sudo org-link and sh block</title>
      <link>https://kitchingroup.cheme.cmu.edu/blog/2015/07/17/A-sudo-org-link-and-sh-block</link>
      <pubDate>Fri, 17 Jul 2015 12:42:34 EDT</pubDate>
      <category><![CDATA[orgmode]]></category>
      <category><![CDATA[babel]]></category>
      <category><![CDATA[emacs]]></category>
      <guid isPermaLink="false">MOPGUwfkhzLawJGSAeH4c0fVZlg=</guid>
      <description>A sudo org-link and sh block</description>
      <content:encoded><![CDATA[


&lt;p&gt;
Shell blocks in org-mode are pretty useful, but they are a little limited in that it is not obvious how to run a sudo command in them.
&lt;/p&gt;

&lt;p&gt;
So for example, this gives me a permission denied error.
&lt;/p&gt;
&lt;div class="org-src-container"&gt;

&lt;pre class="src src-sh"&gt;ls /var/audit
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
One way to get around this is to create an org-mode link like this one:
&lt;/p&gt;

&lt;div class="org-src-container"&gt;

&lt;pre class="src src-emacs-lisp"&gt;&lt;span style="color: #8D8D84;"&gt;;&lt;/span&gt;&lt;span style="color: #8D8D84; font-style: italic;"&gt;http://stackoverflow.com/questions/2472273/how-do-i-run-a-sudo-command-in-emacs&lt;/span&gt;
(org-add-link-type
 &lt;span style="color: #008000;"&gt;"sudo"&lt;/span&gt;
 (&lt;span style="color: #0000FF;"&gt;lambda&lt;/span&gt; (cmd)
   &lt;span style="color: #036A07;"&gt;"Run CMD with sudo."&lt;/span&gt;
   (shell-command
    (concat &lt;span style="color: #008000;"&gt;"echo "&lt;/span&gt; (shell-quote-argument (read-passwd &lt;span style="color: #008000;"&gt;"Password? "&lt;/span&gt;))
            &lt;span style="color: #008000;"&gt;" | sudo -S "&lt;/span&gt; cmd))))
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
Now you can create a link like &lt;a href="ls /var/audit"&gt;ls /var/audit&lt;/a&gt;, and when you click on it you will be prompted for a password, and then you will see a buffer containing the output. To get an actual sudo code block, you need a new org babel library. Here is an example of what it might look like. Tangle this file to generate the library. Note: This is a lightly modified version of ob-emacs-lisp.el, and I have not tested it very thoroughly.
&lt;/p&gt;


&lt;div class="org-src-container"&gt;

&lt;pre class="src src-emacs-lisp"&gt;&lt;span style="color: #8D8D84;"&gt;;;; &lt;/span&gt;&lt;span style="color: #8D8D84; font-style: italic;"&gt;ob-sudo.el --- An org-mode source block to run shell commands as sudo&lt;/span&gt;

&lt;span style="color: #8D8D84;"&gt;;;; &lt;/span&gt;&lt;span style="color: #8D8D84; font-style: italic;"&gt;Commentary:&lt;/span&gt;
&lt;span style="color: #8D8D84;"&gt;;; &lt;/span&gt;&lt;span style="color: #8D8D84; font-style: italic;"&gt;Runs the block of code as a shell command with sudo.&lt;/span&gt;

&lt;span style="color: #8D8D84;"&gt;;;; &lt;/span&gt;&lt;span style="color: #8D8D84; font-style: italic;"&gt;Code:&lt;/span&gt;

(&lt;span style="color: #0000FF;"&gt;defun&lt;/span&gt; &lt;span style="color: #006699;"&gt;org-babel-execute:sudo&lt;/span&gt; (body params)
  &lt;span style="color: #036A07;"&gt;"Run BODY as a shell command using sudo."&lt;/span&gt;
  (&lt;span style="color: #0000FF;"&gt;let*&lt;/span&gt; ((passwd (shell-quote-argument (read-passwd &lt;span style="color: #008000;"&gt;"Password? "&lt;/span&gt;)))
         (result (shell-command-to-string
                  (concat &lt;span style="color: #008000;"&gt;"echo "&lt;/span&gt; passwd
                          &lt;span style="color: #008000;"&gt;" | sudo -S "&lt;/span&gt; body))))
    &lt;span style="color: #8D8D84;"&gt;;; &lt;/span&gt;&lt;span style="color: #8D8D84; font-style: italic;"&gt;this is verbatim from ob-emacs-lisp&lt;/span&gt;
    (&lt;span style="color: #0000FF;"&gt;org-babel-result-cond&lt;/span&gt; (cdr (assoc &lt;span style="color: #006FE0;"&gt;:result-params&lt;/span&gt; params))
      (&lt;span style="color: #0000FF;"&gt;let&lt;/span&gt; ((print-level nil)
            (print-length nil))
        (&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt; (&lt;span style="color: #0000FF;"&gt;or&lt;/span&gt; (member &lt;span style="color: #008000;"&gt;"scalar"&lt;/span&gt; (cdr (assoc &lt;span style="color: #006FE0;"&gt;:result-params&lt;/span&gt; params)))
                (member &lt;span style="color: #008000;"&gt;"verbatim"&lt;/span&gt; (cdr (assoc &lt;span style="color: #006FE0;"&gt;:result-params&lt;/span&gt; params))))
            (format &lt;span style="color: #008000;"&gt;"%S"&lt;/span&gt; result)
          (format &lt;span style="color: #008000;"&gt;"%s"&lt;/span&gt; result)))
      (org-babel-reassemble-table
       result
       (org-babel-pick-name (cdr (assoc &lt;span style="color: #006FE0;"&gt;:colname-names&lt;/span&gt; params))
                            (cdr (assoc &lt;span style="color: #006FE0;"&gt;:colnames&lt;/span&gt; params)))
       (org-babel-pick-name (cdr (assoc &lt;span style="color: #006FE0;"&gt;:rowname-names&lt;/span&gt; params))
                            (cdr (assoc &lt;span style="color: #006FE0;"&gt;:rownames&lt;/span&gt; params)))))))

(&lt;span style="color: #0000FF;"&gt;provide&lt;/span&gt; '&lt;span style="color: #D0372D;"&gt;ob-sudo&lt;/span&gt;)
&lt;span style="color: #8D8D84;"&gt;;;; &lt;/span&gt;&lt;span style="color: #8D8D84; font-style: italic;"&gt;ob-sudo.el ends here&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
Let us add the current dir to our path so we can load it. If you use this a lot, you should put the library on your permanent path.
&lt;/p&gt;

&lt;div class="org-src-container"&gt;

&lt;pre class="src src-emacs-lisp"&gt;(add-to-list 'load-path (expand-file-name &lt;span style="color: #008000;"&gt;"."&lt;/span&gt;))
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
Now, add the sudo "language" to org-babel-load-languages.
&lt;/p&gt;

&lt;div class="org-src-container"&gt;

&lt;pre class="src src-emacs-lisp"&gt;(org-babel-do-load-languages
 'org-babel-load-languages
 '((emacs-lisp . t)
   (python . t)
   (sh . t)
   (matlab . t)
   (sqlite . t)
   (ruby . t)
   (perl . t)
   (org . t)
   (dot . t)
   (plantuml . t)
   (R . t)
   (sudo . t)))
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
And, here it is in action. Hopefully I am not giving away some important information here!
&lt;/p&gt;

&lt;div class="org-src-container"&gt;

&lt;pre class="src src-sudo"&gt;ls /var/audit
&lt;/pre&gt;
&lt;/div&gt;

&lt;pre class="example"&gt;
20141106003522.20141110021519
20141110021548.crash_recovery
20141112154126.crash_recovery
20141119201541.20141122145259
20141122145317.20141124214930
20141124215000.crash_recovery
20141126062011.20141202192451
20141202192507.crash_recovery
20141210133306.crash_recovery
20141225181819.20150106015256
20150106015325.20150111010018
20150111010121.crash_recovery
20150115195518.20150115200101
20150115200110.crash_recovery
20150123061227.20150215123411
20150215123454.crash_recovery
20150225004740.20150310201600
20150310201633.20150314214730
20150314214807.crash_recovery
20150323145600.20150329170647
20150329170721.crash_recovery
20150407215846.20150413000423
20150413000438.20150421122044
20150421122104.20150518122545
20150518122616.20150518124432
20150518124432.20150518124513
20150518124513.20150518125437
20150518125437.20150518125935
20150518125935.20150518132111
20150518132111.20150531202621
20150531202719.20150601123612
20150601123612.20150601124932
20150601124932.20150601125151
20150601125151.20150601125555
20150601125555.20150601131947
20150601131947.20150601132421
20150601132421.20150601133735
20150601133735.20150601140740
20150601140740.20150601154012
20150601154012.20150601155125
20150601155125.20150601155215
20150601155215.20150601160937
20150601160937.crash_recovery
20150613061543.20150614054541
20150614054541.20150625165357
20150625165432.20150625200623
20150625200623.20150628042242
20150628042242.20150628103628
20150628103628.20150630052100
20150630052100.20150701232519
20150702005345.20150710203212
20150710203226.not_terminated
current
&lt;/pre&gt;

&lt;p&gt;
Summary thoughts: I will reiterate again I have not tested this a lot, I was mostly interested in trying to make a new sh block with sudo support. Let me know if it has issues for you, and make sure you have backups of things it could mess up!&lt;/p&gt;
&lt;p&gt;Copyright (C) 2015 by John Kitchin. See the &lt;a href="/copying.html"&gt;License&lt;/a&gt; for information about copying.&lt;p&gt;&lt;p&gt;&lt;a href="/org/2015/07/17/A-sudo-org-link-and-sh-block.org"&gt;org-mode source&lt;/a&gt;&lt;p&gt;&lt;p&gt;Org-mode version = 8.2.10&lt;/p&gt;]]></content:encoded>
    </item>
  </channel>
</rss>
