Workato：シェルスクリプト（Bash）を実行する

# はじめに

WorkatoにはPython, JavaScript, Rubyの３つのローコードコネクタが存在しますが、その他の言語に対応したコネクタは提供されていません。例えば、LinuxやMacを利用するITエンジニアであればそれなりに利用機会が有るはずと思われるシェルスクリプトの実行に対応したコネクタはありません。

しかし、幸いなことにWorkatoのPythonコネクタを利用することで、シェルスクリプト（Bash）を実行することができ、Workatoのレシピ上で実行結果を活用することができます。Python, JavaScript, Rubyはあまり馴染み無いが、シェルスクリプトであればいける！という方は、次で紹介する内容を是非お試しください。

# 手順
## １．Pythonコネクタをレシピ上へ追加します。

## ２．追加したPythonコネクタのInputに `shell_script` フィールドを追加します。
追加された `shell_script` フィールドには、実行したいコードを入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/ef051f23-da54-3256-5047-9b3a3aef3c6f.png)

## ３．追加したPythonコネクタのOutputに `stdout` `stderr` フィールドを追加します。

## ４．追加したPythonコネクタのCodeへ以下のコードを入力します。

```python
import subprocess

def main(input):
  process = subprocess.Popen(input['shell_script'], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  stdout, stderr = process.communicate()
  
  return {"stdout": stdout.decode(), "stderr": stderr.decode()}
  ```

# 実行結果
Test recipeなどでレシピを実行すると、次の通りシェルスクリプトの実行結果を確認することが出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/a85376c2-c0f6-0167-320f-0275b2ee0c8c.png)

なお、複数行に亘るシェルスクリプトにも、もちろん対応しています。
例えば、以下のようなスクリプトを入力して実行すると、`Hello, World!` と現在の日時が出力されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/ccb23151-f696-9b5e-7a5b-32cfd3bbc999.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/81efa940-c7c7-8857-de4a-e263ed7bf21e.png)

# 注意事項

Pythonコネクタでシェルスクリプトを実行する際は、次の点にご注意ください。
- 実行時間や実行可能なコード（サイズ）、メモリ等は、Pythonコネクタの仕様に準じます。
- nobodyユーザーで実行できない（実行権限のない）コマンドを実行することはできません。（`apt` `dpkg` `su` `sudo`など）
- nobodyユーザーで参照できない（参照権限のない）ファイルを参照することはできません。

Pythonコネクタ上でファイルを扱いたい場合は、以下を参照ください。

https://qiita.com/tabimoba/items/f3149d9d7e2b9e4455a0

# その他

シェルスクリプトで利用可能なコマンドは、上記で作成したレシピから以下のシェルスクリプトを実行するで確認することが出来ます。

```shell
#!/bin/bash
echo "/bin"
ls -1 /bin
echo "/usr/bin"
ls -1 /usr/bin
```

2024/7/25時点で利用可能なコマンドは次の通りです。
```
bash
cat
chgrp
chmod
chown
cp
dash
date
dd
df
dir
dmesg
dnsdomainname
domainname
echo
egrep
false
fgrep
findmnt
grep
gunzip
gzexe
gzip
hostname
ln
login
ls
lsblk
mkdir
mknod
mktemp
more
mount
mountpoint
mv
nisdomainname
pidof
pwd
rbash
readlink
rm
rmdir
run-parts
sed
sh
sleep
stty
su
sync
tar
tempfile
touch
true
umount
uname
uncompress
vdir
wdctl
ypdomainname
zcat
zcmp
zdiff
zegrep
zfgrep
zforce
zgrep
zless
zmore
znew
addpart
apt
apt-cache
apt-cdrom
apt-config
apt-get
apt-key
apt-mark
arch
awk
b2sum
base32
base64
basename
basenc
bashbug
c_rehash
captoinfo
catchsegv
chage
chattr
chcon
chfn
choom
chrt
chsh
cksum
clear
clear_console
cmp
comm
csplit
cut
deb-systemd-helper
deb-systemd-invoke
debconf
debconf-apt-progress
debconf-communicate
debconf-copydb
debconf-escape
debconf-set-selections
debconf-show
delpart
diff
diff3
dircolors
dirname
dpkg
dpkg-deb
dpkg-divert
dpkg-maintscript-helper
dpkg-query
dpkg-realpath
dpkg-split
dpkg-statoverride
dpkg-trigger
du
env
expand
expiry
expr
factor
faillog
fallocate
fincore
find
flock
fmt
fold
getconf
getent
getopt
gpasswd
gpgv
groups
head
hostid
i386
iconv
id
infocmp
infotocap
install
ionice
ipcmk
ipcrm
ipcs
ischroot
join
last
lastb
lastlog
ldd
link
linux32
linux64
locale
localedef
logger
logname
lsattr
lscpu
lsipc
lslocks
lslogins
lsmem
lsns
mawk
mcookie
md5sum
md5sum.textutils
mesg
mkfifo
namei
nawk
newgrp
nice
nl
nohup
nproc
nsenter
numfmt
od
openssl
pager
partx
passwd
paste
pathchk
perl
perl5.32.1
pinky
pldd
pr
printenv
printf
prlimit
ptx
realpath
renice
reset
resizepart
rev
rgrep
runcon
savelog
script
scriptlive
scriptreplay
sdiff
seq
setarch
setpriv
setsid
setterm
sg
sha1sum
sha224sum
sha256sum
sha384sum
sha512sum
shred
shuf
sort
split
stat
stdbuf
sum
tabs
tac
tail
taskset
tee
test
tic
timeout
toe
touch
tput
tr
truncate
tset
tsort
tty
tzselect
unexpand
uniq
unlink
unshare
update-alternatives
users
utmpdump
wall
wc
whereis
which
who
whoami
x86_64
xargs
yes
zdump
```